Python進階----UDP協議使用socket通信,socketserver模塊實現並發


Python進階----UDP協議使用socket通信,socketserver模塊實現並發

一丶基於UDP協議的socket

實現UDP協議傳輸數據

img

代碼如下:👇

### 客戶端

# -*-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")}')

實例化ThreadingTCPServer()分析繼承關系

img


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM