udp协议
Posted smart1san
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了udp协议相关的知识,希望对你有一定的参考价值。
一、理论知识热身
1.udp协议在发送消息的时候,是发完就走的,它是不会等待客户端消息的回复。
2.所以 udp 协议中是不用 tcp 协议中的监听和接收客户端的链接请求功能,也就是少了没有了server.listen() 和 conn.client_addr=server.accept() 这两步操作的。
?基于udp 协议的套接字
服务端
1 from socket import * 2 server=socket(AF_INET,SOCK_DGRAM) 3 server.bind((‘4.4.4.61‘,8080)) 4 5 while True: 6 7 # 直接接收客户端的数据和客户端的 IP 和 port 8 data,client_addr=server.recvfrom(1024) 9 print(data,client_addr) 10 11 # 服务端发消息的时候用的是sendto 12 server.sendto(data.upper(),client_addr) 13 14 server.close()
客户端
1 from socket import * 2 client=socket(AF_INET,SOCK_DGRAM) 3 while True: 4 msg=input(‘>>>‘).strip() 5 6 # 向服务端发送消息(注意解码和带上目标服务端的 IP 和 port ) 7 client.sendto(msg.encode(‘utf8‘),(‘4.4.4.61‘,8080)) 8 9 # 接收服务端的返回数据和服务端的 IP 和 port 10 data,server_addr=client.recvfrom(1024) 11 print(data,server_addr) 12 13 client.close()
二、基于socketserver实现并发的socket(基于tcp协议)
1 import socketserver 2 3 4 # 自定义类 5 class MyHandler(socketserver.BaseRequestHandler): 6 7 # 父类中的固有方法 8 def handle(self): 9 print(self) # self:<__main__.MyHandler object at 0x000002252AE24390> 10 print(self.request) # self.request == 相当于是以前的tcp协议中的conn 11 while True: 12 try: 13 data = self.request.recv(1024) 14 if len(data) == 0: break 15 self.request.send(data.upper()) 16 except ConnectionResetError: 17 break 18 19 20 if __name__ == ‘__main__‘: 21 server = socketserver.ThreadingTCPServer((‘4.4.4.60‘, 8080), MyHandler) 22 23 server.serve_forever() # 代表链接循环 24 # 1 循环建立链接,每建立一个链接就会启动一个线程+调用MyHandler类产生一个对象, 25 # 2 调用该对象下的 handle 方法,专门与刚刚建好的链接作通信循环
1 from socket import * 2 client=socket(AF_INET,SOCK_STREAM) 3 client.connect((‘4.4.4.60‘,8080)) 4 while True: 5 msg=input(‘>>‘).strip() 6 if len(msg)==0:continue 7 client.send(msg.encode(‘utf8‘)) 8 data=client.recv(1024) 9 print(data) 10 break 11 client.close()
三、基于socketserver实现并发的socket(基于udp协议)
1 import socketserver 2 class MyHadnler(socketserver.BaseRequestHandler): 3 def handle(self): 4 print(self) # self 是MyHandler的对象 5 print(self.request) # 收到的是(b‘客户端的消息‘,server的一些详细信息) 6 print(self.client_address) # 客户端的IP和PORT 7 data=self.request[0] 8 print(‘客户端发来的信息%s‘%data) 9 self.request[1].sendto(data.upper(),self.client_address) 10 11 if __name__ == ‘__main__‘: 12 server=socketserver.ThreadingUDPServer((‘4.4.4.60‘,8080),MyHadnler) 13 server.serve_forever()
1 from socket import * 2 client=socket(AF_INET,SOCK_DGRAM) 3 while True: 4 msg=input(‘>>‘).strip() 5 if len(msg)==0:continue 6 client.sendto(msg.encode(‘utf8‘),(‘4.4.4.60‘,8080)) 7 data=server_addr=client.recvfrom(1024) 8 print(data,server_addr) 9 break 10 client.close()
以上是关于udp协议的主要内容,如果未能解决你的问题,请参考以下文章