python - 使用 sys.stdin 中的先前输入进行提示

标签 python sockets io buffer stdin

我有一个标准的服务器-客户端 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/

相关文章:

java - 在套接字上发送和接收文件

python - 为什么这里的python socket无法解析域名?

python - Pandas dataframe打印语句,格式化每行一行,无索引

python - 使用 Python Eve 添加 mongoDB 文档数组元素

java - 用于高延迟连接的 sslsocket session 机制

python - Selenium 即使提供了很高的隐式等待时间也无法找到元素

java - java中ObjectInputStream中的IOException

Java, "Scanner"的内存使用

Python:为什么添加参数后方法的行为会有所不同?

Python SQL 连接到错误的 IP 地址