由于套接字工作,python从键盘非阻塞模式读取

时间:2014-04-20 10:40:41

标签: python sockets keyboard nonblocking

我在python中编写客户端服务器,工作时它们每秒发送一次keepalive数据包。

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

完美的行为是在Keepaliving时在控制台中写入,以及在按下“输入”文本的过程时。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

我希望它会帮助别人!

答案 1 :(得分:0)

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

答案 2 :(得分: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

实施例

print(repr(raw_input_alarm(timeout=1)))

alarm需要整数秒。如果你想要更小的超时;见signal.setitimer()