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

Posted

技术标签:

【中文标题】在 Python 中使用 Twitch IRC 时“由对等方重置连接”【英文标题】:"Connection reset by peer" when using Twitch IRC in Python 【发布时间】:2019-04-10 12:24:36 【问题描述】:

我尝试用 Python 编写自己的机器人,以通过其 IRC 接口与 Twitch-chat 连接和交互。我有连接并且可以接收和发送数据。我还用 PONG 回答传入的 PING(大约 5 分钟后发送)。但是在大约 3 分钟不活动后(所以在我得到一个 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 模块。

【问题讨论】:

您是否尝试过让您每 2 分钟发送一次 PONG,即使您没有收到 ping? 看起来这行得通。我只是发送从服务器获得的相同 PING。我没有收到 PONG 回复,但这似乎不是问题。这是“正确”的做法,还是我发送的内容真的不重要? 【参考方案1】:

自己每 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 的提示。

【讨论】:

以上是关于在 Python 中使用 Twitch IRC 时“由对等方重置连接”的主要内容,如果未能解决你的问题,请参考以下文章

Twitch IRC 聊天机器人成功连接但未检测到命令

Python 3 Twitch IRC bot 接收 Python 或错误代码的消息限制?

禁止登录 IRC 频道,以 twitch 为例

使用 irc.bot.SingleServerIRCBot 持续存在的线程(与 twitch 一起使用)

在 Twitch bot 中添加帐户和更加用户友好的集成

C# IRC 和 Twitch 空闲断开连接?