< 返回新闻公共列表
基于UDP协议的服务器——UDP服务器创建方案
发布时间:2020-11-20 17:50:27
什么是UDP服务器?
UDP服务器就是实现一个基于UDP协议的服务器来与客户端通信。就是用来收发数据,进行数据处理的。
与TCP服务器不同的是不用建立连接,直接调用recvfrom来收包。
跟TCP服务器一样,UDP服务器也可以通过使用 socketserver 库很容易地被创建。
先定义一个实现 handle() 特殊方法的类,为客户端连接服务。 这个类的 request 属性是一个包含了数据包和底层socket对象的元组。client_address 包含了客户端地址。
- from socketserver import BaseRequestHandler, UDPServer
- import time
- class TimeHandler(BaseRequestHandler):
- def handle(self):
- print('Got connection from', self.client_address)
- message, sock = self.request
- resp = time.ctime()
- sock.sendto(resp.encode('ascii'), self.client_address)
- if __name__ == '__main__':
- serv = UDPServer(('', 16888), TimeHandler)
- serv.serve_forever()
- -----------------------------
- from socket import socket, AF_INET, SOCK_DGRAM
- s = socket(AF_INET, SOCK_DGRAM)
- s.sendto(b'', ('localhost', 16888))
- print(s.recvfrom(8192))
UDPServer 类是单线程的,一次只能为一个客户端连接服务。 如果想要并发操作,可以实例化一个 ForkingUDPServer 或 ThreadingUDPServer 对象
- from socketserver import ThreadingUDPServer
- if __name__ == '__main__':
- serv = ThreadingUDPServer(('',20000), TimeHandler)
- serv.serve_forever()
可以直接使用socket
- from socket import socket, AF_INET, SOCK_DGRAM
- import time
- def time_server(address):
- sock = socket(AF_INET, SOCK_DGRAM)
- sock.bind(address)
- while True:
- msg, addr = sock.recvfrom(8192)
- print('Got message from', addr)
- resp = time.ctime()
- sock.sendto(resp.encode('ascii'), addr)
- if __name__ == '__main__':
- time_server(('', 16888))