繁体   English   中英

Python套接字,如何摆脱无限循环和处理异常

[英]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:

一些注意事项(在等待您的完整代码时)

  1. 您连续有2个while(true)的事实很奇怪
  2. 您可能想将except:语句上移至if not data语句之前,并用continue替换pass
  3. ord(data[2])建议您使用的是二进制协议,您实际上应该考虑使用struct模块unpack()pack()代替。

除了上述提示之外,您还需要缓冲数据-使用流协议时,您不能仅仅假设一次调用recv就可以获取所有想要的数据。 相反,您必须将您从recv读取的内容添加到缓冲区中,然后检查缓冲区以查看其是否包含消息的所有数据。 如果是这样,请提取消息,进行处理,然后对其余缓冲区重复上述操作。 当您无法提取更多消息时,请返回并从套接字中阅读更多内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM