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
原文地址:https://www.cnblogs.com/Smart1san/p/9291730.html