在Python中使用Twitch IRC时“对等连接重置”

时间:2019-04-10 12:24:36

标签: python sockets irc twitch

我尝试用Python编写自己的机器人,以通过其IRC接口与Twitch-chat连接并进行交互。我已建立连接,可以接收和发送数据。我还会用PONG应答传入的PING(大约5分钟后会发送)。但是经过约三分钟的闲置时间(因此,在我还没有收到PING之前),连接失败了

socket.error: [Errno 104] Connection reset by peer

我使用Python中的socket模块进行连接。在我的套接字上调用recv()方法时发生错误。


我能弄清楚的一些事情:

  • 在连接失败之前,它们不是传入的(未应答的)PING。

  • 上一次聊天消息与断开连接之间的时间每次约为3分钟。并且它足以接收某些东西(链接其他人的聊天消息)来重置此计时器。我不必自己发送任何东西。

  • 我首先以为自己超时是因为我很久没收到任何东西了。似乎并非如此,因为如果我为socket.recv()设置了较短的超时时间,则会收到socket.timeout: timed out,而不是上面显示的错误。

  • 我想我不会错过任何发送给我的数据,因为所有聊天消息都会通过。但是我为了确定接收数据而发布了主循环。


我的问题是,为什么连接失败,如何防止这种情况?

我觉得这是一个模糊的问题。这是我第一次尝试使用IRC接口,而且我不依赖于如何获得有关问题到底出在哪里的更多信息。


以防万一,这是我用来接收数据的电源循环。我认为这很好,因为所有聊天消息都会通过。但是也许有一个错误,我错过了一些传入的数据(例如PING)。

readbuffer = ''
while True:
    readbuffer = readbuffer + s.recv(1024)
    temp = string.split(readbuffer, '\n')
    readbuffer = temp.pop()
    for line in temp:
        print(line)
        # PING/PONG
        if "PING :tmi.twitch.tv" in line:
            print("PONG :tmi.twitch.tv")
            s.send(line.replace('PING', 'PONG'))

ssocket()模块的socket

1 个答案:

答案 0 :(得分:2)

我自己每2分钟对服务器进行一次ping操作即可解决此问题。我刚刚添加了此功能

import time, threading

def sendPing(s):
    print('sending PING')
    s.send("PING :tmi.twitch.tv")
    threading.Timer(120, sendPing, [s]).start()

sendPing(s)

在主循环之前。

感谢ChatterOne的提示。