Python網路編程詳解,python網路編程
1、伺服器就是一系列硬體或軟體,為一個或多個用戶端(服務的使用者)提供所需的“服務”。它存在唯一目的就是等待用戶端的請求,並響應它們(提供服務),然後等待更多請求。
2、用戶端/伺服器架構既可以應用於電腦硬體,也可以應用於電腦軟體。
3、在伺服器響應用戶端之前,首先會建立一個通訊節點,它能夠使伺服器監聽請求。
一、通訊端:通訊端點
1、通訊端
通訊端是電腦網路資料結構,它體現了上節中所描述的“通訊端點”的概念。在任何類型的通訊開始之前,網路應用程式必須建立通訊端。
有兩種類型的通訊端:基於檔案和面向網路的。
2、通訊端地址:主機-連接埠對
如果一個通訊端像一個電話插孔-允許通訊的一些基礎設施,那麼主機名稱和連接埠號碼就像區號和電話號碼的組合。有效連接埠號碼範圍為0-65535(小於1024的連接埠號碼預留給了系統)
3、連線導向的通訊端和與不需連線的通訊端
連線導向,在進行通訊之前必須建立一個串連。實現這種連線類型主要協議是TCP(傳輸控制通訊協定)
無串連,在通訊之前並不需要建立串連。主要協議是UDP(使用者資料包通訊協定)
二、Python中的網路編程
1、socket()模組函數
為建立TCP/IP通訊端:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)
建立UDP/IP通訊端:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.常見的通訊端對象方法和屬性
| 名稱 |
描述 |
| 伺服器通訊端方法 |
|
| s.bind() |
將地址(主機名稱、連接埠號碼對)綁定到通訊端上 |
| s.listen() |
設定並啟動TCP監聽器 |
| s.accept() |
被動接受TCP用戶端串連,一直等待直到串連到達(阻塞) |
| 用戶端通訊端方法 |
|
| s.connect() |
主動發起TCP伺服器串連 |
| s.connect_ex() |
connect的擴充版本,此時會以錯誤碼的形式返回問題,而不是拋出一個異常 |
| 普通的通訊端方法 |
|
| s.recv() |
接受TCP訊息 |
| s.send() |
發送TCP訊息 |
| s.sendall() |
完整的發送TCP訊息 |
| s.recvfrom() |
接收UDP訊息 |
| s.shutdown() |
關閉串連 |
| s.close() |
關閉通訊端 |
3、建立TCP伺服器
ss = socket() #建立伺服器通訊端ss.bind() #通訊端與地址綁定ss.listen() #監聽串連inf_loop: #伺服器無限迴圈 cs = ss.accept() #接收用戶端串連 comm_loop: #通訊迴圈 cs.recv()/cs.send() #對話(接收、發送) cs.close() #關閉用戶端通訊端ss.close() #關閉伺服器通訊端(可選)
#!/usr/bin/env python#TCP時間戳記伺服器from socket import *from time import ctimeHOST = ''PORT = 21567BUFSIZ = 1024ADDR = (HOST,PORT)tcpSerSock = socket(AF_INET,SOCK_STREAM)tcpSerSock.bind(ADDR)tcpSerSock.listen(5)while True: print('waiting for connecting...') tcpClisock, addr = tcpSerSock.accept() print('...connected from:',addr) while True: data = tcpClisock.recv(BUFSIZ) if not data: break tcpClisock.send('[%s] %s' % (bytes(ctime(),'utf-8'),data)) tcpClisock.close()tcpSerSock.close()
4、建立TCP用戶端
cs = socket()cs.connect()comm_loop: cs.send()/cs.recv()cs.close()
#!/usr/bin/env python#TCP時間戳記用戶端from socket import *HOST = '127.0.0.1'PORT = 21567BUFSIZ = 1024ADDR = (HOST,PORT)tcpClisock = socket(AF_INET,SOCK_STREAM)tcpClisock.connect(ADDR)while True: data = input('> ') if not data: break tcpClisock.send(data) data = tcpClisock.recv(BUFSIZ) if not data: break print(data.decode('utf-8'))tcpClisock.close()
5、建立UDP伺服器
ss = socket()ss.bind()inf_loop: cs = ss.recvfrom()/ss.sendto()ss.close()
#!/usr/bin/env python#UDP時間戳記伺服器from socket import *from time import ctimeHOST = ''PORT = 21567BUFSIZ = 1024ADDR = (HOST,PORT)udpSerSock = socket(AF_INET,SOCK_DGRAM)udpSerSock.bind(ADDR)while True: print('waiting for message...') data, addr=udpSerSock.recvfrom(BUFSIZ) udpSerSock.sendto('[%s] %s' % (ctime(),data),addr) print('...received from and returned to:',addr)udpSerSock.close()
6、建立UDP用戶端
cs = socket()comm_loop: cs.send()/cs.recvfrom()cs.close()
#!/usr/bin/env python#UDP時間戳記用戶端from socket import *HOST = 'localhost'PORT = 21567BUFSIZ = 1024ADDR = (HOST,PORT)udpClisock = socket(AF_INET,SOCK_DGRAM)while True: data = input('> ') if not data: break udpClisock.sendto(data,ADDR) data, ADDR=udpClisock.recvfrom(BUFSIZ) if not data: break print(data)udpClisock.close()
以上就是本文關於Python網路編程詳解的全部內容,希望對大家有所協助。歡迎參閱:Python中enumerate函數代碼解析、python資料類型判斷type與isinstance的區別執行個體解析、python中requests庫session對象的妙用詳解等,有什麼問題可以隨時留言,有問題我就改。。。