Python進階----UDP協議使用socket通信,socketserver模塊實現並發
一丶基於UDP協議的socket
實現UDP協議傳輸數據
代碼如下:👇
### 客戶端
# -*-coding:utf-8-*-
# Author:Ds
import socket
# 實例化UDP協議的socket對象 ,配置參數, socket.SOCK_DGRAM(數據報)
udp_cli=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while 1:
# 1. 向客戶端發送數據
to_ser_msg=input('請輸入內容:>>>').strip()
# sendto 包含 字節數據和服務端的ip和端口 兩部分內容
udp_cli.sendto(to_ser_msg.encode('utf-8'),('127.0.0.1',9999))
# 2. recvfrom 接收服務端返回的數據
from_ser_msg=udp_cli.recvfrom(1024)
print(f'來自{from_ser_msg[1]}的信息:{from_ser_msg[0].decode("utf-8")}')
### 服務端
# -*-coding:utf-8-*-
# Author:Ds
import socket
# 實例化UDP協議的socket對象 ,配置參數, socket.SOCK_DGRAM(數據報)
udp_server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server.bind(('127.0.0.1',9999)) # 綁定服務端IP和端口
while 1 :
# 1. 接收任意客戶端發送的數據
from_cli_msg=udp_server.recvfrom(1024)
# 接收到的是元組類型的數據, 包含客戶端的IP和端口,客戶端發來的字節數據
print(from_cli_msg)
# 格式化輸出
print(f'來自{from_cli_msg[1]}的信息:{from_cli_msg[0].decode("utf-8")}')
# 2. 向客戶端返回數據,
to_cli_msg=input('請輸入回復消息:>>>').strip()
# 因為接收的數據中包含了客戶端的的IP和地址
udp_server.sendto(to_cli_msg.encode('utf-8'),from_cli_msg[1])
總結:
sendto: 發送數據,包含兩部分內容(字節形式數據,服務端的IP和地址)
recvfrom: 接收數據(1024)
udp是無鏈接,先啟動哪一端都不會報錯(無論服務端還是客戶端發送數據,都不管另一方是否能接收到)
二丶基於socketserver實現並發
socketserver作用:
需要用它來實現並發,也就是同時可以和多個客戶端進行通信
### 服務端
# -*-coding:utf-8-*-
# Author:Ds
import socketserver
# 這個請求類要繼承BaseRequestHandler,並且還有重寫父類里的handle()
class My_Server(socketserver.BaseRequestHandler):
def handle(self):
while 1:
# 接收數據
from_cli_data=self.request.recv(1024).decode('utf-8')
print(from_cli_data)
# 返回數據
## 服務器還是依次給客戶端返回數據
to_cli_data=input('請輸入要返回的消息:>>').strip()
self.request.send(to_cli_data.encode('utf-8'))
if __name__ == '__main__':
IP_PROT=('127.0.0.1',9999) # 定義 服務端的IP和端口
# 1.利用模塊 socketserver 開啟多線程TCP
# 2. 把端口和IP IP_PROT , 自定義請求處理類My_Server
server=socketserver.ThreadingTCPServer(IP_PROT,My_Server)
server.serve_forever() # 永遠開啟連接通道
### 客戶端
## 可以開啟多個客戶端, 同時向服務器發送數據,
# -*-coding:utf-8-*-
# Author:Ds
import socket
client=socket.socket()
client.connect(('127.0.0.1',9999))
while 1:
ui=input('輸入內:>>').strip()
client.send(ui.encode('utf-8'))
from_ser_data=client.recv(1024)
print(f'來自服務器的信息:{from_ser_data.decode("utf-8")}')