Python socket網路編程TCP/IP伺服器與用戶端通訊,pythonsocket
Python socket網路編程
初學 python,前段時間買了兩本書《python 編程從入門到實踐》《Python 核心編程第三版》,第一本書主要講的是一些基本文法和一些基本的使用方法,而第二本則深入很多,自己看來也是一知半解,剛好看到了這部分網路編程,依然有好多不太理解的地方,不過想來通過自己不斷的摸索,不斷地搜尋資料學習,早晚應該會變得通透吧.......
這部分主要使用的模組就是 socket 模組,在這個模組中可以找到 socket()函數,該函數用於建立通訊端對象,通訊端也有自己的方法集,這些方法可以實現基於通訊端的網路通訊。
socket()模組函數
要建立通訊端,必須使用 socket.socket()函數,他一般的文法如下
socket(socket_family, socket_type, protocol=0)
其中socket_family是 AF_UNIX或 AF_INET,socket_type 是 SOCK_STREAM 或 SOCK_DGRAM,protocol 通常省略,預設=0.
所以建立 TCP/IP 通訊端,可以使用下面的方式調用 socket.socket().
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
同樣建立 UDP/IP 通訊端,使用下面的方法調用
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
建立 TCP 伺服器
建立 TCP 伺服器的流程基本如下,並非正真正的代碼
ss = socket() #建立伺服器通訊端 ss.bind() #通訊端與地址綁定 ss.listen() #監聽串連 inf_loop: #伺服器無限迴圈 cs = ss.accepr() #接受用戶端串連 comm_loop: #通訊迴圈 cs.recv()/cs.send() #對話(接收/發送) cs.close() #關閉用戶端通訊端 ss.close() #關閉伺服器通訊端(可選)
實際中建立 TCP 伺服器基本流程就如上邊所說,可能稍有不同但基本思路應該是相通的,下邊是真正穿件伺服器的代碼:
#!/usr/bin/env python# -*- coding: utf-8 -*-from socket import * #將 socket 屬性引入到命名空間HOST = '' #這是對 bind()方法的標識表示可以使用任何可用的地址PORT = 21571 #連接埠號碼BUFSIZ = 1024 #緩衝區大小,1kbADDR = (HOST,PORT) #地址????tcpSerSocket = socket(AF_INET,SOCK_STREAM) #建立 tcp 通訊端tcpSerSocket.bind(ADDR) #將地址綁定到通訊端上tcpSerSocket.listen(5) #設定並啟動通訊端監聽while True: #無限迴圈,等待用戶端串連 print('waiting for connection...') tcpCliSocket,addr = tcpSerSocket.accept() #被動接受用戶端串連 print('...connected from:',addr) while True: #對話迴圈,等待用戶端發送訊息 data = tcpCliSocket.recv(BUFSIZ) #接收用戶端訊息 if not data: #如果訊息是空白,跳出對話迴圈,關閉當前串連 break tcpCliSocket.send(data) #如果收到訊息,將訊息原封不動返回用戶端 tcpCliSocket.close()tcpSerSocket.close()
建立 TCP 用戶端
同上邊一樣,一個簡單的非代碼流程
cs = socket() #建立用戶端通訊端 cs.connect() #嘗試串連伺服器 comm_loop: #通訊迴圈 cs.send()/cs.recv() #對話(發送/接收) cs.close() #關閉用戶端通訊端
實際中建立用戶端也是翻譯上邊的步驟
#!/usr/bin/env python# -*- coding: utf-8 -*-from socket import *HOST = 'localhost' #伺服器的主機名稱PORT = 21571 #連接埠號碼BUFSIZ = 1024 #緩衝區ADDR = (HOST,PORT) #地址tcpCliSocket = socket(AF_INET,SOCK_STREAM) #建立用戶端通訊端tcpCliSocket.connect(ADDR) #串連伺服器while True: #通訊迴圈 data = input('> ') #用戶端輸入資訊 if not data: #如果輸入資訊為空白,則跳出迴圈,關閉通訊 break data = str.encode(data) tcpCliSocket.send(data) #發送用戶端資訊 data = tcpCliSocket.recv(BUFSIZ) #接受伺服器返回資訊 if not data: #如果伺服器未返回資訊,關閉通訊迴圈 break print('get:',data.decode('utf-8'))tcpCliSocket.close()
當然,這隻是最基礎的通訊,而且關於主機名稱,連接埠號碼之類的東西暫時還不是很懂,目前所做的只是在同一台電腦上通訊,連接埠號碼也需要一致,如果不同的電腦進行通訊該怎麼做?我還只是個小白.....
感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!