Чтение всех ожидающих строк в обработчике SocketServer - PullRequest
0 голосов
/ 19 января 2020

Это простой 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

1 Ответ

1 голос
/ 19 января 2020

Документация предполагает, что readline() будет повторно вызывать recv(), пока не получит символ новой строки, который оставит следующую строку в буфере сокета и приведет к повторному вызову handle(). Но, похоже, это не так.

Вместо этого вы можете использовать:

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