2011-10-04 181 views
1

所以我正在研究一个Python IRC框架,并且我正在使用Python的socket模块。我喜欢使用Twisted吗?不,不是。Python socket模块的问题

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

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

我不能处理半收到的消息,我不知道是否有连破案的一种方式。在理想情况下,我会收到缓冲区中的所有内容,但它看起来不像socket提供了一种方法。

任何帮助?

+0

为什么另起炉灶?现在已经有很多解决方案可以做到这一点,Twisted恰好是最通用的。 – jathanism

+0

为什么你不想使用Twisted? – dicato

回答

4

你真的应该使用selectpoll,例如通过asyncoreselect,或扭曲(你不喜欢)。

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

既然你知道你的输入,使通过线感测线,那么你收到回路可以看起来像:

  • 而真实:
    • 附加新数据缓冲
    • 查找EOLS,过程并删除所有的完整生产线
+0

我正在做类似的事情;我将输入拆分成行,并将行添加到输入缓冲区。我想我可以使用换行符的存在来确定接收的数据是否是“完整的”。 –

+0

是的,在你的情况下,换行符决定消息的结束 – orip

0

流模式插座(例如,TCP)永远无法保证你在任何种类整齐成帧方式接收消息。如果您收到部分输入线路 - 有时会出现 - 您需要保持局部线路,直到线路的其余部分出现。

使用Twisted将为您节省大量时间。更好的是,您可能需要考虑使用现有的IRC框架 - 其中有一些已经可用。