在用户点击回车键之前获取STDIN



我对套接字编程和stdin/stdout相对陌生,我需要知道是否有办法在用户点击回车键之前从stdin获取输入。

例如,如果他们键入"F",但没有按enter键,我需要看到"F"。我需要这个作为一个基本的聊天应用程序,我需要用户输入到下一行,这样我就可以打印收到的消息而不会打断他们的文本。

我曾尝试冻结STDOUT,直到用户完成键入,但这只是在代码到达输入代码块时冻结。

当前代码:

### Main Handle ###
def Handler():
print("nConnected.n")
print(f"{server.recv(1028).decode()}n")
def _send():
while True:
sys.stdout = buffer = io.StringIO()
text = input()
sys.stdout = old_stdout
print(buffer.getvalue())
try:
server.sendall(text.encode())
except:
pass
def _get():
while True:
print(stdin)
try:
message = server.recv(1028).decode()
if message == "":
print("nYou got disconnected from the server, sorry bud. :C")
break
except ConnectionResetError:
print("nYou got disconnected from the server, sorry bud. :C")
break
print(f"n{message}")
_gthread = Thread(target = _get)
_gthread.start()
_sthread = Thread(target = _send)
_sthread.start()
while True:
pass

非常感谢任何帮助

作为启动序列的一部分,shell或终端模拟器或两者都会要求将终端置于"熟"模式,该模式缓冲输入,直到看到新行。这种缓冲发生在终端驱动程序中,甚至在它到达程序之前,这就是为什么程序在stdin中看不到单个字符的原因。

您需要让您的程序将终端置于原始(未冷却(模式,或者不进行缓冲的原始模式的变体。

Python示例。

请注意,在"真实"原始模式中,CTRL+C和朋友不起作用,所以您可能不想要tty.setraw(),而是想要tty.setcbreak()

最新更新