从键盘非阻塞模式读取,因为套接字正在工作,python

从键盘非阻塞模式读取,因为套接字正在工作,python,python,sockets,keyboard,nonblocking,Python,Sockets,Keyboard,Nonblocking,我正在用python编程一个客户机服务器,他们在工作时每秒发送一次keepalive数据包 我需要客户端从我的键盘读取一个向服务器发送特殊数据包的操作,但在读取时我无法停止发送keepalive数据包,因此如果我以标准方式读取,它会阻止并停止keepalive数据包的发送 最完美的行为是在控制台中写入,同时保持分页,并在按下“回车”键时处理该文本 有什么想法吗 谢谢 这基本上是一个线程问题。我建议您考虑使用管理您的网络连接。它可以异步工作,让您能够拿起按键 找到它,使用select.select

我正在用python编程一个客户机服务器,他们在工作时每秒发送一次keepalive数据包

我需要客户端从我的键盘读取一个向服务器发送特殊数据包的操作,但在读取时我无法停止发送keepalive数据包,因此如果我以标准方式读取,它会阻止并停止keepalive数据包的发送

最完美的行为是在控制台中写入,同时保持分页,并在按下“回车”键时处理该文本

有什么想法吗


谢谢

这基本上是一个线程问题。我建议您考虑使用管理您的网络连接。它可以异步工作,让您能够拿起按键

找到它,使用select.select我可以这样做:

selectList = [sktTCP,sys.stdin]
(read, write, exc) =  select.select(selectList, [], [], 0 )

我希望它能帮助别人

在Unix上读取用户输入而不阻塞(时间过长)的另一种方法是使用报警:

from signal import SIGALRM, alarm, signal

class Alarm(Exception):
    pass

def alarm_handler(*args):
    raise Alarm

def raw_input_alarm(prompt='', timeout=None):
    if timeout is None: # no timeout
        return raw_input(prompt)

    # set signal handler
    signal(SIGALRM, alarm_handler)
    alarm(timeout) # produce SIGALRM in `timeout` seconds
    try:
        return raw_input(prompt)
    except Alarm:
        return '' # timeout happened
    finally:
        alarm(0) # cancel alarm
例子
报警
需要整数秒。如果你想要更小的超时时间;请参阅。

问题是,由于项目的要求,我不能使用Twisted和其他相关的东西!你能分享你的代码吗。你的问题有点难理解。你不能在Windows上使用
select
sys.stdin
,除非它是套接字。顺便说一句,select对管道并不总是可靠的。看见
print(repr(raw_input_alarm(timeout=1)))