关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

基于UDP协议的服务器——UDP服务器创建方案

发布时间:2020-11-20 17:50:27

什么是UDP服务器?

UDP服务器就是实现一个基于UDP协议的服务器来与客户端通信。就是用来收发数据,进行数据处理的。


与TCP服务器不同的是不用建立连接,直接调用recvfrom来收包。

跟TCP服务器一样,UDP服务器也可以通过使用 socketserver 库很容易地被创建。

先定义一个实现 handle() 特殊方法的类,为客户端连接服务。 这个类的 request 属性是一个包含了数据包和底层socket对象的元组。client_address 包含了客户端地址。


  1. from socketserver import BaseRequestHandler, UDPServer
  2. import time


  3. class TimeHandler(BaseRequestHandler):
  4. def handle(self):
  5. print('Got connection from', self.client_address)
  6. message, sock = self.request
  7. resp = time.ctime()
  8. sock.sendto(resp.encode('ascii'), self.client_address)


  9. if __name__ == '__main__':
  10. serv = UDPServer(('', 16888), TimeHandler)
  11. serv.serve_forever()
  12. -----------------------------
  13. from socket import socket, AF_INET, SOCK_DGRAM
  14. s = socket(AF_INET, SOCK_DGRAM)
  15. s.sendto(b'', ('localhost', 16888))
  16. print(s.recvfrom(8192))

UDPServer 类是单线程的,一次只能为一个客户端连接服务。 如果想要并发操作,可以实例化一个 ForkingUDPServer 或 ThreadingUDPServer 对象

  1. from socketserver import ThreadingUDPServer

  2. if __name__ == '__main__':
  3. serv = ThreadingUDPServer(('',20000), TimeHandler)
  4. serv.serve_forever()

可以直接使用socket

  1. from socket import socket, AF_INET, SOCK_DGRAM
  2. import time

  3. def time_server(address):
  4. sock = socket(AF_INET, SOCK_DGRAM)
  5. sock.bind(address)
  6. while True:
  7. msg, addr = sock.recvfrom(8192)
  8. print('Got message from', addr)
  9. resp = time.ctime()
  10. sock.sendto(resp.encode('ascii'), addr)

  11. if __name__ == '__main__':
  12. time_server(('', 16888))



/../template/Home/Databay/PC/Static