一、UDP 数据报协议
特点:
①客户端允许发空————默认有报头
②协议不会粘包
③在服务端不存在的情况下,客户端不会报错
④udp 协议支持并发效果
注:udp在启动服务之后,只能被动等待客户端发消息,客户端发送消息是需要带上服务端地址
同理,在服务端回消息是也要带上客户端地址
示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8080)) msg, addr = server.recvfrom(1024) print(msg.decode('utf-8')) server.sendto(b'hello', addr) server.close()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) client.sendto(b'hello server baby!', server_addr) msg, addr = client.recvfrom(1024) print(msg, addr)
总结:
TCP协议就类似于打电话 UDP 协议就类似于发短信
二、SocketServer模块介绍(让tcp也能支持并发)
1、基于tcp协议的SocketServer:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socketserver class MyBaby(socketserver.BaseRequestHandler): def handle(self): # 通信循环 while True: # self.request相当于你的conn通信对象 data,sock = self.request # 收消息 print(data) sock.sendto(data.upper(),self.client_address) # self.client_address客户端地址 if __name__ == '__main__': server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyBaby) server.serve_forever()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket client = socket.socket() client.connect(('127.0.0.1',8080)) while True: client.send(b'hello') data = client.recv(1024) print(data)
2、基于udp协议的SocketServer:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socketserver class MyBaby(socketserver.BaseRequestHandler): def handle(self): # 通信循环 while True: # self.request相当于你的conn通信对象 data,sock = self.request # 收消息 print(data) sock.sendto(data.upper(),self.client_address) # self.client_address客户端地址
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket import time client = socket.socket(type=socket.SOCK_DGRAM) sever_addr = ('127.0.0.1',8080) while True: client.sendto(b'hello',sever_addr) data,addr = client.recvfrom(1024) print(data,addr) time.sleep(1)