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 方法,专门与刚刚建好的链接作通信循环
server
技术分享图片
 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()
client

三、基于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()
server
技术分享图片
 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()
client

 

以上是关于udp协议的主要内容,如果未能解决你的问题,请参考以下文章

Python 之 Socket编程(TCP/UDP)

java 25 - 4 网络编程之 UDP协议传输的代码优化

Python UDP协议编程

Python UDP协议编程

用UDP实现可靠传输

UDP协议编程