[英]Python sockets, how to escape from infinite loop and handle exceptions
我有一个连接到远程服务器的脚本。 代码如下
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((remote_host,remote_port))
s.setblocking(False)
while True:
try:
data = s.recv(1024)
if not data:
break
pkt_type = ord(data[2]) # get pkt type
if pkt_type == Reset:
s.send(data)
if pkt_type == Authenticate:
processAuthenticate(s,data)
break
except:
pass
while(True)
.
.
.
我等待重置并回显到服务器,然后等待Authenticate数据包,然后旋转几下,然后将其回显到服务器。 成功完成此操作后,我现在可以从服务器请求数据。 这是在下一个while(true)循环中完成的。
这是这样做的最好方法。 有时,当我运行脚本时遇到错误,处理异常并阻止执行下一个wile循环的最简单方法是什么?
谢谢
有限状态机(FSM)几乎是执行此类操作的规范方法。 在Python中执行FSM的一个很好的参考是: http : //wiki.python.org/moin/FiniteStateMachine
编辑:
看起来FSM应该在这里很方便。
实际上,我建议您看一下Twisted Reactor-尚未亲自使用过,但它可以完成所有繁琐的工作和令人讨厌的工作,而如果使用FSM和事件循环,则需要自己实施while
-loop本质上是)
编辑2:
一些注意事项(在等待您的完整代码时)
while(true)
的事实很奇怪 except:
语句上移至if not data
语句之前,并用continue
替换pass
ord(data[2])
建议您使用的是二进制协议,您实际上应该考虑使用struct
模块unpack()
和pack()
代替。 除了上述提示之外,您还需要缓冲数据-使用流协议时,您不能仅仅假设一次调用recv就可以获取所有想要的数据。 相反,您必须将您从recv读取的内容添加到缓冲区中,然后检查缓冲区以查看其是否包含消息的所有数据。 如果是这样,请提取消息,进行处理,然后对其余缓冲区重复上述操作。 当您无法提取更多消息时,请返回并从套接字中阅读更多内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.