Клиентский сокет Python3 получил сообщение не завершено - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь отправлять команды на мой удаленный сервер с помощью сокетов Python.Мой удаленный сервер прослушивает порт 50000 (сокет сервера не настроен на Python).Когда я захожу на сервер и запрашиваю нужную мне команду, я получаю правильные результаты в следующем порядке:

echo mycommand | nc 127.0.0.1 50000

Я возвращаю три строки в стандартный вывод:

>ServerOn=
>Command_received
>Cmd=mycommand

Я хочудобиться того же на стороне клиента с помощью Python3.Я знаю, что могу подключиться к серверу, но не получаю полного ответа, как указано выше.Я попробовал следующее:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('myhost', 50000))
s.sendall('mycommand')
data = s.recv(1024)
s.close()
print(repr(data))

, но я получаю только первую строку

>ServerOn=

Есть идеи, почему я пропускаю часть ответа?

1 Ответ

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

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

Если вы хотите проверить / проанализировать то, что вы получили, необходимо будет прочитать их в буферпока у вас не будет ожидаемого объема данных.

В краткосрочной перспективе продолжайте чтение, пока сокет не закроется:

    connected = True
    while connected:
        data = s.recv(2048)
        if not data:
            connected = False
            print("### Client Disconnected")
        else:
            print("Received data: %u octets" % (len(data)))
            try:
                as_string = str(data,'utf-8')
                print(as_string)
            except:
                pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...