Это очень неожиданное поведение:
Вот классическая короткая программа из учебника, которая использует один поток для получения символов один за другим из потока сокета и их отображения, а второй поток — для чтения ввода и отправки ввода через тот же поток сокета.
импортировать сокет, импортировать потоки, импортировать getch, импортировать sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
def rxWorker():
while(True):
r = s.recv(1)
print(r.decode('ascii'), end='')
def txWorker():
while (True):
i = input('')
s.send(i.encode())
s.connect(('localhost',9999))
threading.Thread(name='Rx', target=rxWorker).start()
threading.Thread(name='Tx', target=txWorker).start()
Это работает против прослушивателя netcat, который работает на другом терминале:
nc -l localhost 9999
На данный момент все работает хорошо. Линии передаются из стороны в сторону и выглядят так, как ожидалось.
Теперь ввод изменен на немедленный, поэтому сторона python отправляет символы по мере их ввода (не дожидаясь новой строки), например:
импортировать сокет, импортировать потоки, импортировать getch, импортировать sys
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
def rxWorker():
while(True):
r = s.recv(1)
print(r.decode('ascii'), end='')
def txWorker():
while (True):
# i = input('')
i = getch.getche()
s.send(i.encode())
s.connect(('localhost',9999))
threading.Thread(name='Rx', target=rxWorker).start()
threading.Thread(name='Tx', target=txWorker).start()
Обратите внимание, что единственным изменением является способ чтения ввода: i = getch.getche()
против i = input('')
Теперь поведение другое.
Символы со стороны python отображаются на стороне netcat правильно и сразу.
Проблема: персонаж со стороны netcat теперь не сразу отображается на стороне python. На самом деле они не отображаются, пока один или несколько символов не будут отправлены с python на netcat.
Это очень странно и как бы нарушает мой поток управления/:
пожалуйста, порекомендуйте
Система: Ubuntu 16.04, питон 3.5.2