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