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