python網路程式設計socket實現服務端、客戶端操作詳解
阿新 • • 發佈:2020-03-25
本文例項講述了python網路程式設計socket實現服務端、客戶端操作。分享給大家供大家參考,具體如下:
本文內容:
- socket介紹
- TCP:
- 服務端
- 客戶端
- UDP:
- 服務端
- 客戶端
首發時間:2018-02-08 01:14
修改:
- 2018-03-20 :重置了佈局,增加了UDP
什麼是socket:
- socket又稱"套接字",應用程式通常通過"套接字"向網路發出請求或者應答網路請求。
- 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。
- socket就像電話線插口,只有電話線插上了,才能通訊。
- python中使用socket來進行網路連線傳輸
TCP:
- 如果使用socket模組來建立TCP客戶端和服務端:
- 首發需要匯入模組:import socket
- 然後建立過程在下面
服務端:
TCP服務端一般需要下面幾個操作:建立,繫結IP地址和埠,監聽埠,等待連線,接收資料,傳輸資料,關閉連線
- 建立:server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 【引數預設就是socket.AF_INET,socket.SOCK_STREAM】
- 繫結埠:server.bind(('IP地址',埠)),【地址和埠號是一個 tuple 】
- 監聽:server.listen()
- 接受連線: conn,addr=server.accept(),返回值是一個連線例項和一個地址,地址是連線過來的客戶端地址,而資料操作要利用這個連線例項
- 傳輸資料:conn.send(data),【傳輸的資料必須是位元組流,所以對字串資料需要使用encode() 】
- 接收資料read:conn.recv(size),【傳輸的資料必須是位元組流,size是接收的位元組數,如果需要轉成Unicode,需要使用decode() 】
- 關閉連線close:close()
import socket server=socket.socket()#建立socket server.bind(('localhost',1234))#繫結 server.listen()#監聽 print("開始等待。。。") conn,addr=server.accept()#接收連線 print("連線成功") data=conn.recv(1024)#接收資料 print(data.decode()) conn.send(data)#傳送資料 server.close()#關閉連線 print("--------------------")
- 上述程式碼存在一個問題:只能接受一次連線,連線結束後,服務端socket將關閉,更改成不立即關閉能等待下一個連線的:
#伺服器端 import socket server = socket.socket() server.bind(('localhost',1234)) #繫結ip和埠 server.listen(5) #監聽 while True: print("開始等待") conn,addr = server.accept() print(conn,addr) print("客戶端連線") while True: data = conn.recv(1024) print("recv:",data) if not data: #當data=0時為真 print("連線斷開...") break conn.send(data) server.close()
注:上述程式碼中在linux中正常執行,在windows中會報錯!
如果要在windows中執行,需要捕獲異常:
#伺服器端 import socket server = socket.socket() server.bind(('localhost',addr) print("客戶端連線") while True: try: data = conn.recv(1024) print("recv:",data) if not data: #當data=0時為真 print("連線斷開...") break conn.send(data) except ConnectionResetError as e: print(e) break server.close()
客戶端:
TCP客戶端一般需要下面幾個操作:建立socket,連線遠端socket,傳輸資料 ,接收資料,關閉連線
- 建立:client=socket.socket()
- 連線:client.connect(('IP地址',埠)),其中地址和埠號是一個 tuple
- 傳輸資料:client.send(data),傳輸的資料必須是位元組流,所以對字串資料需要使用encode()
- 接收資料recv:client.recv(size),傳輸的資料是位元組流,如果需要轉成Unicode,需要使用decode()
- 關閉連線close:close()
import socket client=socket.socket()#建立socket client.connect(('localhost',1234))#連線 client.send("你好".encode())#傳送資料 data=client.recv(1024)#接收資料 print(data.decode()) client.close()#關閉連線
- 上述程式碼存在一個問題:只能傳送一次資料,發生完資料就會斷開連線,改成可以多次傳送資料,不自動斷開的【前提是服務端能接收多次】:
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:
服務端:
UDP服務端通常有以下幾個操作:建立socket,繫結埠,傳輸資料,接收資料
- 建立socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- 繫結埠:server.bind(addr),【addr是一個元組,內容為(地址,埠)】
- 接收資料:data,client_addr=server.recvfrom(1024)
- 傳輸資料: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客戶端通常有以下幾個操作:建立socket,傳輸資料,接收資料
- 建立socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
- 傳輸資料:server.sendto(data,addr),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模組來建立TCP客戶端和服務端:
更多關於Python相關內容可檢視本站專題:《Python Socket程式設計技巧總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》
希望本文所述對大家Python程式設計有所幫助。