Клиентский сокет Python3 получил сообщение не завершено

1

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

echo mycommand | nc 127.0.0.1 50000

Я возвращаю три строки в stdout:

>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=

Любые идеи, почему я не хватает части ответа?

  • 0
    Вы пробовали: echo mycommand | nc 127.0.0.1 50000 - (примечание заканчивается - ) Ссылка: superuser.com/questions/261900/…
  • 0
    @ Kingsley Да, это тоже работает, у меня проблема с Python, а не с netcat, я хочу, чтобы мой код Python возвращал тот же результат, что и мой netcat. Пока что возвращается только первая строка.
Теги:
python-3.x
sockets

1 ответ

0

Сокет 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
  • 0
    Спасибо, но это не сработало, оно по-прежнему возвращало только первую строку Received data: 13 octets; >ServerOn= . Я попытался использовать netcat с другого хоста, чтобы убедиться, что это проблема с брандмауэром, но он работает echo mycommand | nc my_host 50000 . По какой-то причине сокеты python возвращают только первую строку ... Это потому, что мой сервер не использует python в качестве основы кода?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню