Я пытаюсь написать простой клиент на основе сокетов в Python, который будет подключаться к серверу telnet. Я могу проверить сервер, подключившись к его порту (5007) и введя текст. Он отвечает NAK (ошибка) или AK (успех), иногда сопровождается другим текстом. Кажется очень простым.
Я написал клиент для подключения и связи с сервером, но он зависает при первой попытке прочитать ответ. Соединение установлено успешно. Запросы, такие как getsockname и getpeername, успешны. Команда send возвращает значение, равное количеству отправляемых символов, поэтому, похоже, оно отправляется правильно. Но в конце всегда зависает, когда пытаюсь прочитать ответ.
Я пытался использовать оба файловых объекта, таких как readline и write (через socket.makefile), а также send и recv. С помощью файлового объекта я попытался сделать это с помощью «rw» и прочитать и записать с помощью этого объекта, а затем попробовал один объект для «r» и другой для «w», чтобы отделить их. Ничто из этого не сработало.
Я использовал анализатор пакетов, чтобы посмотреть, что происходит. Я не разбираюсь во всем, что вижу, но во время сеанса telnet я вижу свой набранный текст и текст сервера, возвращающийся. Во время подключения к Python-сокету я вижу, как мой текст отправляется на сервер, но в пакетах назад, похоже, нет текста.
Любые идеи о том, что я делаю неправильно, или какие стратегии попробовать?
Вот код, который я использую (в данном случае это с send и recv):
#!/usr/bin/python
host = "localhost"
port = 5007
msg = "HELLO EMC 1 1"
msg2 = "HELLO"
import socket
import sys
try:
skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
print("Error creating socket: %s" % e)
sys.exit(1)
try:
skt.connect((host,port))
except socket.gaierror, e:
print("Address-related error connecting to server: %s" % e)
sys.exit(1)
except socket.error, e:
print("Error connecting to socket: %s" % e)
sys.exit(1)
try:
print(skt.send(msg))
print("SEND: %s" % msg)
except socket.error, e:
print("Error sending data: %s" % e)
sys.exit(1)
while 1:
try:
buf = skt.recv(1024)
print("RECV: %s" % buf)
except socket.error, e:
print("Error receiving data: %s" % e)
sys.exit(1)
if not len(buf):
break
sys.stdout.write(buf)
О, если это полезно, вот пример сеанса telnet, выполняемого вручную:
ubuntu:~/mac/python$ telnet localhost 5007
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HELLO EMC 1 1
HELLO ACK EMCNETSVR 1.1
Первая строка 'HELLO' - это то, что я напечатал, вторая - ответ.