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")}')
实例化ThreadingTCPServer()分析继承关系