3

我正在开发一个 IRC-bot 作为一个小的 Python 项目。该机器人运行良好,但无法长时间保持连接。过了一会儿,它只是将空行打印到终端然后 ping 出去(因为它无法处理来自服务器的 PING)。

这段代码处理接收部分:

def listen(channel):
    while True:
        data = conn.recv(4096)
        print data
        if data != '':
            if data.split()[0] == 'PING':
                process the data

过了一会儿,机器人只是在终端上打印白线,我不知道为什么。

完整代码可在 Github 上找到:https ://github.com/Silox/Python-IRC-bot/blob/master/bot.py#L101

4

2 回答 2

1

从这里引用:

当 arecv返回 0 字节时,表示对方已关闭(或正在关闭)连接。您将不会在此连接上收到更多数据。曾经。

服务器已经关闭了你的连接,可能是由于你没有回复它的 ping 导致的超时。

于 2012-08-22T21:53:16.097 回答
1

IRC 消息是否总是适合/填充 4K 边界?如果没有,那么您可能错过了 ping,因为它在两次调用recv(). 您需要收集返回的数据recv(),然后查找协议定义的消息边界。如果您不这样做,那么当消息与您选择的 4K 缓冲区不一致时,您将无法正确处理它们并且可能会丢失消息。这可能是您首先失去连接的原因。(我不知道 IRC,但这是一般原则)

于 2012-08-22T22:10:05.617 回答