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

什么是UDP服务器?

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

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

 

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

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

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

 

  1. from socketserver import BaseRequestHandler, UDPServer
  2. import time
  3.  
  4.  
  5. class TimeHandler(BaseRequestHandler):
  6. def handle(self):
  7. print('Got connection from', self.client_address)
  8. message, sock = self.request
  9. resp = time.ctime()
  10. sock.sendto(resp.encode('ascii'), self.client_address)
  11.  
  12.  
  13. if __name__ == '__main__':
  14. serv = UDPServer(('', 16888), TimeHandler)
  15. serv.serve_forever()
  16. -----------------------------
  17. from socket import socket, AF_INET, SOCK_DGRAM
  18. s = socket(AF_INET, SOCK_DGRAM)
  19. s.sendto(b'', ('localhost', 16888))
  20. print(s.recvfrom(8192))

 

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

 

  1. from socketserver import ThreadingUDPServer
  2.  
  3. if __name__ == '__main__':
  4. serv = ThreadingUDPServer(('',20000), TimeHandler)
  5. serv.serve_forever()

 

可以直接使用socket

 

  1. from socket import socket, AF_INET, SOCK_DGRAM
  2. import time
  3.  
  4. def time_server(address):
  5. sock = socket(AF_INET, SOCK_DGRAM)
  6. sock.bind(address)
  7. while True:
  8. msg, addr = sock.recvfrom(8192)
  9. print('Got message from', addr)
  10. resp = time.ctime()
  11. sock.sendto(resp.encode('ascii'), addr)
  12.  
  13. if __name__ == '__main__':
  14. time_server(('', 16888))

 

以上就是今天小湾给大家介绍的超详细的创建UDP服务器的方法,各位学会了吗?

想了解更多有关服务器的知识和内容请关注我吧或者点击下方的了解更多进入小湾的主页!