读取 SocketServer 处理程序中的所有等待行

Reading all waiting lines in a SocketServer handler

这是一个简单的 socketserver 示例,应该通过 UDP 接收一行并将其回显:

import socketserver

class LineHandler(socketserver.DatagramRequestHandler):
    def handle(self):
        line = self.rfile.readline().strip()
        print(line)

server = socketserver.UDPServer(('', 4444), LineHandler)
server.serve_forever()

但是如果两行同时进来,只读第一行:

(printf 'lol\n'; printf 'what\n') | nc -u localhost 4444

文档建议 readline() 将重复调用 recv() 直到它获得换行符,这将在套接字的缓冲区中留下下一行并导致调用 handle()再次。但事实并非如此。

相反,您可以使用:

for line in self.rfile:
    line = line.strip()
    print(line)