之前我们尝试了TCP服务器与客户端的通讯,现在我们要实现一个服务器,通过UDP协议与客户端程序通讯。
socketserver
和TCP服务器的实现一样,我们使用Python的socketserver
库就可以快速实现一个简单的报时务器:
from socketserver import BaseRequestHandler, UDPServer
import time
class TimeHandler(BaseRequestHandler):
def handle(self):
print('Got connection from', self.client_address)
msg, sock = self.request
resp = time.ctime()
sock.sendto(resp.encode(), self.client_address)
if __name__ == '__main__':
serv = UDPServer(('', 8000), TimeHandler)
serv.serve_forever()
这里我们使用成功self.request
获取的套接字sock
发送时间刀指定客户端self.client_address
。
下面我们通过UDP连接的方式去获取服务器报时:
>>> from socket import socket, AF_INET, SOCK_DGRAM
>>> s = socket(AF_INET, SOCK_DGRAM)
>>> s.sendto(b'', ('localhost', 8000))
0
>>> s.recvfrom(8192)
(b'Sun May 23 21:17:54 2021', ('127.0.0.1', 8000))
>>>
ThreadingUDPServer
UDPServer
可以快速实现一个简单的服务器,但默认情况下只会得到一个单线程的服务器,不能同时连接多个客户端。使用ThreadingUDPServer
则可以快速实现多线程的服务器:
from socketserver import ThreadingUDPServer
if __name__ == '__main__':
serv = ThreadingUDPServer(('', 8000), TimeHandler)
serv.serve_forever()