2015-12-31 1 views
4

У меня возникла странная проблема, и я не могу понять, в чем причина! На самом деле, я написал простой сервер в Python, который эхо-файлы все, что входит в клиент. Чтобы протестировать его, я подключился к серверу по telnet, но как только я введу символ, он станет эхом! Я не знаю, как остановить это! На самом деле я хочу закончить слово и после нажатия клавиши ввода, мой сервер эхо. Вот мой простой сервер:Эхо на сервере Python перед нажатием клавиши ввода

import socket 
import sys 

HOST = '' # Symbolic name meaning all available interfaces 
PORT = 5000 # Arbitrary non-privileged port 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print 'Socket created' 

try: 
    s.bind((HOST, PORT)) 
except socket.error , msg: 
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] 
    sys.exit() 

print 'Socket bind complete' 

s.listen(10) 
print 'Socket now listening' 

#now keep talking with the client 
while 1: 
    #wait to accept a connection - blocking call 
    conn, addr = s.accept() 
    print 'Connected with ' + addr[0] + ':' + str(addr[1]) 

    while True: 
     data = conn.recv(1024) 
     reply = 'OK...' + data 
     if not data: 
      break  
     conn.sendall(reply) 

conn.close() 
s.close() 
+1

'conn.recv()' не ждет новой строки. – Barmar

+0

Так что я могу использовать вместо этого? Что-то, что ждет новой строки – Unknown

+0

У меня тоже есть эта проблема, и для ее решения серверная сторона - это боль. Проблема в том, что в Mac, telnet открывается в linemode. Вы также можете указать линию режима или символ режима. Но в Windows Telnet он открывается в режиме символов, и для его изменения нет команды режима !!! На самом деле, я не нашел ЛЮБОГО способа получить linemode в Windows (XP) telnet! – RufusVS

ответ

4

Согласно странице telnet людей, клиент пытается ввести линейный режим, и возврат к символьному режиму, если удаленный сервер не поддерживает:

После того, как соединение было открыто, telnet попытается включить параметр TELNET LINEMODE. Если это не удается, то telnet вернется к одному из двух режимов ввода: либо «символ за раз», либо «старая строка за строкой» в зависимости от того, что поддерживает удаленная система.

Вы можете изменить свой код на стороне сервера рукопожатие с клиентом для включения линии за линией, или вы можете заставить клиента использовать «старый» построчный режиме он-лайн, где буферы символов локально и отправляет их сразу.

Для этого бывшего, вы должны быть в состоянии послать следующую последовательность байт после начального соединения как found here:

0x255 0x253 0x34 

сделать последний, что вы можете сделать (нажмите CTRL правой скобки первой), который включит этот режим в telnet-клиенте (при условии, что вы используете команду telnet BSD - в Windows это может быть иначе).

^]toggle localchars 
+2

Он ** мог ** изменить свой код сервера для анализа данных и подождать, пока не получит новую строку. – Barmar

+0

Да, Мартин, я уже проверял этот вопрос раньше, но это не могло решить мою проблему. Как вы уже упомянули, я думаю, мне нужно найти способ остановить мой терминал от отправки нажатий клавиш сразу, но я не знаю, как это сделать! – Unknown

+1

Изменен мой ответ - похоже, для этого есть поддержка на стороне сервера или поддержка на стороне клиента. –