python網(wǎng)絡(luò)編程socket實(shí)現(xiàn)服務(wù)端、客戶端操作詳解
本文實(shí)例講述了python網(wǎng)絡(luò)編程socket實(shí)現(xiàn)服務(wù)端、客戶端操作。分享給大家供大家參考,具體如下:
本文內(nèi)容:
- socket介紹
- TCP:
- 服務(wù)端
- 客戶端
- UDP:
- 服務(wù)端
- 客戶端
首發(fā)時(shí)間:2018-02-08 01:14
修改:
- 2018-03-20 :重置了布局,增加了UDP
什么是socket:
- socket又稱"套接字",應(yīng)用程序通常通過"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求。
- 網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個連接的一端稱為一個socket。
- socket就像電話線插口,只有電話線插上了,才能通信。
- python中使用socket來進(jìn)行網(wǎng)絡(luò)連接傳輸
TCP:
- 如果使用socket模塊來創(chuàng)建TCP客戶端和服務(wù)端:
- 首發(fā)需要導(dǎo)入模塊:import socket
- 然后創(chuàng)建過程在下面
服務(wù)端:
TCP服務(wù)端一般需要下面幾個操作:建立,綁定IP地址和端口,監(jiān)聽端口,等待連接,接收數(shù)據(jù),傳輸數(shù)據(jù) ,關(guān)閉連接
- 建立:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM) 【參數(shù)默認(rèn)就是socket.AF_INET, socket.SOCK_STREAM】
- 綁定端口:server.bind(('IP地址',端口)),【地址和端口號是一個 tuple 】
- 監(jiān)聽:server.listen()
- 接受連接: conn,addr=server.accept(),返回值是一個連接實(shí)例和一個地址,地址是連接過來的客戶端地址,而數(shù)據(jù)操作要利用這個連接實(shí)例
- 傳輸數(shù)據(jù):conn.send(data),【傳輸?shù)臄?shù)據(jù)必須是字節(jié)流,所以對字符串?dāng)?shù)據(jù)需要使用encode() 】
- 接收數(shù)據(jù)read:conn.recv(size),【傳輸?shù)臄?shù)據(jù)必須是字節(jié)流,size是接收的字節(jié)數(shù),如果需要轉(zhuǎn)成Unicode,需要使用decode() 】
- 關(guān)閉連接close:close()
import socket server=socket.socket()#建立socket server.bind(('localhost',1234))#綁定 server.listen()#監(jiān)聽 print("開始等待。。。") conn,addr=server.accept()#接收連接 print("連接成功") data=conn.recv(1024)#接收數(shù)據(jù) print(data.decode()) conn.send(data)#發(fā)送數(shù)據(jù) server.close()#關(guān)閉連接 print("--------------------")
- 上述代碼存在一個問題:只能接受一次連接,連接結(jié)束后,服務(wù)端socket將關(guān)閉,更改成不立即關(guān)閉能等待下一個連接的:
#服務(wù)器端 import socket server = socket.socket() server.bind(('localhost',1234)) #綁定ip和端口 server.listen(5) #監(jiān)聽 while True: print("開始等待") conn, addr = server.accept() print(conn, addr) print("客戶端連接") while True: data = conn.recv(1024) print("recv:",data) if not data: #當(dāng)data=0時(shí)為真 print("連接斷開...") break conn.send(data) server.close()
注:上述代碼中在linux中正常運(yùn)行,在windows中會報(bào)錯!
如果要在windows中運(yùn)行,需要捕獲異常:
#服務(wù)器端 import socket server = socket.socket() server.bind(('localhost',1234)) #綁定ip和端口 server.listen(5) #監(jiān)聽 while True: print("開始等待") conn, addr = server.accept() print(conn, addr) print("客戶端連接") while True: try: data = conn.recv(1024) print("recv:",data) if not data: #當(dāng)data=0時(shí)為真 print("連接斷開...") break conn.send(data) except ConnectionResetError as e: print(e) break server.close()
客戶端:
TCP客戶端一般需要下面幾個操作:建立socket,連接遠(yuǎn)程socket,傳輸數(shù)據(jù) ,接收數(shù)據(jù),關(guān)閉連接
- 建立:client=socket.socket()
- 連接:client.connect(('IP地址',端口)),其中地址和端口號是一個 tuple
- 傳輸數(shù)據(jù):client.send(data),傳輸?shù)臄?shù)據(jù)必須是字節(jié)流,所以對字符串?dāng)?shù)據(jù)需要使用encode()
- 接收數(shù)據(jù)recv:client.recv(size),傳輸?shù)臄?shù)據(jù)是字節(jié)流,如果需要轉(zhuǎn)成Unicode,需要使用decode()
- 關(guān)閉連接close:close()
import socket client=socket.socket()#建立socket client.connect(('localhost',1234))#連接 client.send("你好".encode())#發(fā)送數(shù)據(jù) data=client.recv(1024)#接收數(shù)據(jù) print(data.decode()) client.close()#關(guān)閉連接
- 上述代碼存在一個問題:只能發(fā)送一次數(shù)據(jù),發(fā)生完數(shù)據(jù)就會斷開連接,改成可以多次發(fā)送數(shù)據(jù),不自動斷開的【前提是服務(wù)端能接收多次】:
import socket client=socket.socket() client.connect(('localhost',1234)) while True: cmd=input(">>") if len(cmd)==0: continue client.send(cmd.encode()) cmd_res=client.recv(1024) print(cmd_res.decode()) client.close()
UDP:
服務(wù)端:
UDP服務(wù)端通常有以下幾個操作:創(chuàng)建socket,綁定端口,傳輸數(shù)據(jù),接收數(shù)據(jù)
- 創(chuàng)建socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- 綁定端口:server.bind(addr),【addr是一個元組,內(nèi)容為(地址,端口)】
- 接收數(shù)據(jù):data,client_addr=server.recvfrom(1024)
- 傳輸數(shù)據(jù):server.sendto(data,client_addr)
import socket import time server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(("localhost",1234)) start_time=time.time() while True: data,addr=server.recvfrom(1024) print(data,addr) server.sendto("hello".encode(),addr) time.sleep(1) if time.time()-start_time>30: break server.close()
客戶端:
UDP客戶端通常有以下幾個操作:創(chuàng)建socket,傳輸數(shù)據(jù),接收數(shù)據(jù)
- 創(chuàng)建socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- 傳輸數(shù)據(jù):server.sendto(data,addr),【addr是一個元組,內(nèi)容為(地址,端口)】
- 接收數(shù)據(jù):data,server_addr=client.recvfrom(1024)
import socket,time client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) addr=("localhost",1234) start_time=time.time() while True: client.sendto(time.ctime().encode(),addr) data,addr= client.recvfrom(1024) print(data) time.sleep(1) if time.time()-start_time>30: break client.close()
- 如果使用socket模塊來創(chuàng)建TCP客戶端和服務(wù)端:
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python Socket編程技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python BeautifulSoup基本用法詳解(通過標(biāo)簽及class定位元素)
這篇文章主要介紹了Python BeautifulSoup基本用法(通過標(biāo)簽及class定位元素),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08如何用Python數(shù)據(jù)可視化來分析用戶留存率
今天和大家來分享一些數(shù)據(jù)可視化方向的干貨,我們來嘗試用Python來繪制一下“漏斗圖”,感興趣的小伙伴和小編一起進(jìn)入課題吧,但愿大家會有所收獲2021-09-09matplotlib圖例legend語法及設(shè)置的方法
這篇文章主要介紹了matplotlib圖例legend語法及設(shè)置的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07對python 通過ssh訪問數(shù)據(jù)庫的實(shí)例詳解
今天小編就為大家分享一篇對python 通過ssh訪問數(shù)據(jù)庫的實(shí)例詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02Python中np.linalg.norm()用法實(shí)例總結(jié)
在線性代數(shù)中一個向量通過矩陣轉(zhuǎn)換成另一個向量時(shí),原有向量的大小就是向量的范數(shù),這個變化過程的大小就是矩陣的范數(shù),下面這篇文章主要給大家介紹了關(guān)于Python中np.linalg.norm()用法的相關(guān)資料,需要的朋友可以參考下2022-07-07Pytorch卷積層手動初始化權(quán)值的實(shí)例
今天小編就為大家分享一篇Pytorch卷積層手動初始化權(quán)值的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08解讀sqlalchemy的常用數(shù)據(jù)類型有哪些
這篇文章主要介紹了解讀sqlalchemy的常用數(shù)據(jù)類型有哪些,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03python模擬登陸,用session維持回話的實(shí)例
今天小編就為大家分享一篇python模擬登陸,用session維持回話的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12