所以我正在研究Python IRC框架,我正在使用Python的socket
模块。我觉得使用Twisted吗?不,不是真的。
无论如何,我有一个无限循环读取和处理来自socket.recv(xxxx)
的数据,其中xxxx
在这种情况下真的无关紧要。我使用str.split("\r\n")
将收到的数据拆分为消息并逐个处理。
我的问题是我必须在socket.recv()
中设置一个特定的“读取大小”来定义从套接字读取多少数据。当我收到一串数据时(例如,当我连接到IRC服务器并接收MOTD.etc时),总会有一条消息跨越套接字的两个“读取”(即一行读取一行{ {1}},其余部分在无限循环的下一次迭代中读取。)
我无法处理半收到的消息,我不确定是否有办法检测它们。在一个理想的情况下,我会收到缓冲区中的所有内容,但它看起来不像socket.recv()
提供了一种方法。
任何帮助?
答案 0 :(得分:4)
您应该使用select
或poll
,例如通过asyncore或select,或扭曲(您不愿意)。
从套接字读取,你永远不知道每次阅读会收到多少。您可以一次接收多条消息,或者将一条消息拆分为多个读取。您应始终在缓冲区中收集数据,直到您可以使用它,然后从缓冲区中删除您使用的数据(但保留尚未使用的数据)。
由于您知道您的输入逐行有意义,因此您的接收循环可能类似于:
答案 1 :(得分:0)
流模式套接字(例如,TCP)绝不保证您将以任何整齐框架格式接收消息。如果您收到部分输入 - 有时 将不可避免地发生 - 您需要保持部分线,直到线的其余部分出现。
使用Twisted将为您节省大量时间。更好的是,您可能希望研究使用现有的IRC框架 - 其中有许多已经可用。