我有一个标准的服务器-客户端 TCP 设置。基本思想是聊天系统。仅查看 session 的客户端一侧,客户端提示用户输入以下内容:
sys.stdout.write('<%s> ' % username)
sys.stdout.flush()
使用以下逻辑:
while True:
socket_list = [sys.stdin, s]
read_sockets, write_sockets, error_sockets = select.select(socket_list, [], [])
for sock in read_sockets:
if sock == s:
data = sock.recv(4096)
if data:
output('\a\r%s' % data) #output incoming message
sys.stdout.write('<%s> ' % username) #prompt for input
sys.stdout.flush()
else:
raise SystemExit
else:
msg = getASCII(sys.stdin.readline()) # returns only the ascii
if msg:
s.send(msg)
sys.stdout.write('<%s> ' % username)
sys.stdout.flush())
(注意:截断的代码片段。可以找到完整的代码 here 链接的代码已更新,因此不再相关。)
问题是,当用户打字并从服务器收到传入消息时,客户端会输出该消息并提示再次输入。正在键入的消息仍在标准输入缓冲区中,但已从屏幕上消失。如果用户按回车键发送消息,则整个消息将被发送,包括缓冲区中的内容,但在用户的屏幕上,只会显示消息的第二部分,即中断后的部分。
我有一个可能的解决方案,即当我提示输入时,我检查缓冲区中是否有任何内容并随提示一起输出,但我不知道如何实现它。如有任何帮助,我们将不胜感激。
最佳答案
要实现您的解决方案,您必须以无缓冲的方式从标准输入读取。 readline() 和 read() 会阻塞,直到 EOL 或 EOF。在按下返回键之前,您需要来自标准输入的数据。为了实现这一点,这可能会有所帮助:http://code.activestate.com/recipes/134892-getch-like-unbuffered-character-reading-from-stdin/当您要写入数据时,您可以从 stdin 读取数据,将其存储在某处,并在输出消息后再次输出。由于标准输入不会调用 select,因此创建一个单独的读取线程来读取标准输入。到目前为止,使用锁来访问 stdin 的数据。
关于python - 使用 sys.stdin 中的先前输入进行提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38745956/