我在python中编写客户端服务器,工作时它们每秒发送一次keepalive数据包。
我需要客户端从键盘上读取一个动作,向服务器发送一个特殊的数据包,但是在读取时我无法停止发送keepalive数据包,所以如果我通过标准方式读取,它会阻止并停止keepalive数据包发送。
完美的行为是在Keepaliving时在控制台中写入,以及在按下“输入”文本的过程时。
有什么想法吗?
谢谢!
答案 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()
。