Python套接字模块的问题

时间:2011-10-04 01:02:07

标签: python sockets irc

所以我正在研究Python IRC框架,我正在使用Python的socket模块。我觉得使用Twisted吗?不,不是真的。

无论如何,我有一个无限循环读取和处理来自socket.recv(xxxx)的数据,其中xxxx在这种情况下真的无关紧要。我使用str.split("\r\n")将收到的数据拆分为消息并逐个处理。

我的问题是我必须在socket.recv()中设置一个特定的“读取大小”来定义从套接字读取多少数据。当我收到一串数据时(例如,当我连接到IRC服务器并接收MOTD.etc时),总会有一条消息跨越套接字的两个“读取”(即一行读取一行{ {1}},其余部分在无限循环的下一次迭代中读取。)

我无法处理半收到的消息,我不确定是否有办法检测它们。在一个理想的情况下,我会收到缓冲区中的所有内容,但它看起来不像socket.recv()提供了一种方法。

任何帮助?

2 个答案:

答案 0 :(得分:4)

您应该使用selectpoll,例如通过asyncoreselect,或扭曲(您不愿意)。

从套接字读取,你永远不知道每次阅读会收到多少。您可以一次接收多条消息,或者将一条消息拆分为多个读取。您应始终在缓冲区中收集数据,直到您可以使用它,然后从缓冲区中删除您使用的数据(但保留尚未使用的数据)。

由于您知道您的输入逐行有意义,因此您的接收循环可能类似于:

  • 虽然如此:
    • 将新数据附加到缓冲区
    • 寻找EOL,处理并删除所有完整的行

答案 1 :(得分:0)

流模式套接字(例如,TCP)绝不保证您将以任何整齐框架格式接收消息。如果您收到部分输入 - 有时 将不可避免地发生 - 您需要保持部分线,直到线的其余部分出现。

使用Twisted将为您节省大量时间。更好的是,您可能希望研究使用现有的IRC框架 - 其中有许多已经可用。