【发布时间】:2018-07-30 22:43:38
【问题描述】:
这是一个非常意外的行为:
这是一个教科书经典短程序,它使用一个线程从套接字流中一个一个地获取字符并显示它,第二个线程读取输入并通过同一个套接字流发送输入。
导入套接字 导入线程 导入 getch 导入系统
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 导入系统
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() vs i = input('')
现在行为不同了。
python 端的字符会立即正确地出现在 netcat 端。
问题:netcat 端的字符现在不会立即显示在 python 端。 实际上,直到一个或几个字符从 python 发送到 netcat 后,您才会显示。
这很奇怪,有点破坏了我的控制流程/:
请指教
系统:Ubuntu 16.04,python 3.5.2
【问题讨论】:
-
根据 abarnert 的注释对示例代码进行了一些更改。问题,如描述的那样持续存在。
标签: python python-sockets