1

我有一个连接到远程服务器的脚本。代码如下

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) 循环中完成的。

这是最好的方法吗?有时当我运行脚本时出现错误,处理异常和防止执行下一个诡计循环的最简单方法是什么?

谢谢

4

3 回答 3

1

有限状态机 (FSM) 几乎是执行此类操作的规范方法。在 Python 中进行 FSM 的一个很好的参考是:http ://wiki.python.org/moin/FiniteStateMachine

于 2010-01-20T09:48:33.693 回答
0

编辑: 看起来FSM在这里应该很方便。

实际上,我建议您看一下Twisted Reactor - 我自己(还没有)使用它,但是如果使用 FSM 和事件循环(您的while-loop本质上是)

编辑2:

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

  1. 你有 2 个连续的事实while(true),嗯,很奇怪
  2. 您可能希望在except:语句之前将语句向上移动if not data并替换passcontinue
  3. ord(data[2])建议您使用二进制协议,您确实应该考虑使用struct模块unpack()pack()不是。
于 2010-01-20T09:32:13.873 回答
0

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

于 2010-01-20T11:45:13.033 回答