Получите полный ответ от клиента на TCP-сервере (Python) - PullRequest
0 голосов
/ 11 октября 2018

Как мне, как tcp-серверу, получить полный ответ от клиента?

Когда я являюсь клиентом, я просто делаю:

server_response = b''
buffer = s.recv(BUFFER_SIZE)
while buffer:
    server_response += buffer
    buffer = s.recv(BUFFER_SIZE)

Но когда я сервер, яне может этого сделать, так как recv там является блокирующим вызовом

Протокол не определяет размер сообщения, но обычно это либо текст с переменной длиной, а иногда текст с переменной длиной и двоичные данные изфайл, из которого включен размер.Он определяет маркер, который является \ n.Когда \ n найден, сообщение превышает

1 Ответ

0 голосов
/ 11 октября 2018

Как мне, как tcp-серверу, получить полный ответ от клиента?

TCP - это потоковый протокол, у которого нет внутренней границы сообщения.Это означает, что не существует такого понятия, как «полный ответ», если только у вас теперь нет длины вперед или у вас есть какой-то маркер для определения конца сообщения или сообщения заканчивается концом TCP-соединения.

... Протокол не определяет размер сообщения.

Таким образом, длина не известна заранее.Тогда вам понадобится своего рода маркер.

... но обычно это либо текст с переменной длиной, а иногда текст с переменной длиной и двоичные данные из файла, из которого включен размер

Нет четкого различия между двоичным и текстовым, так как двоичный просто означает, что байт может принимать любое значение, и поэтому текст также является своего рода двоичным.Поэтому вам нужен четкий маркер в конце текста (возможно, какой-нибудь символ \0 или новая строка).Также размер включен для двоичной части не ясно, как именно размер включен.Обычно используются разные варианты, например префикс фиксированного размера в виде двоичного файла (uint16, uint32 ...), шестнадцатеричное значение с новой строкой (как в кодированном кодировании HTTP), десятичное значение ...

Onceу вас есть четкое и однозначное определение того, как выглядит ваше сообщение, вы должны быть в состоянии реализовать это определение в вашем анализаторе сообщений.Поскольку ваше текущее описание не обеспечивает этой ясности, дальнейшая помощь не может быть оказана в реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...