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 #緩沖區大小,1kb ADDR = (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()
當然,這只是最基礎的通信,而且關于主機名,端口號之類的東西暫時還不是很懂,目前所做的只是在同一臺電腦上通信,端口號也需要一致,如果不同的電腦進行通信該怎么做?我還只是個小白.....
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
