Python进阶----UDP协议使用socket通信,socketserver模块实现并发

时间:2021-09-23 05:29:38

Python进阶----UDP协议使用socket通信,socketserver模块实现并发

一丶基于UDP协议的socket

实现UDP协议传输数据

Python进阶----UDP协议使用socket通信,socketserver模块实现并发

代码如下:????

### 客户端

# -*-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()分析继承关系

Python进阶----UDP协议使用socket通信,socketserver模块实现并发