"Connection reset by peer" 在 Python 中使用 Twitch IRC 时
"Connection reset by peer" when using Twitch IRC in Python
我尝试在 Python 中编写自己的机器人,通过其 IRC 界面连接 Twitch 聊天并与之交互。我有连接并且可以接收和发送数据。我还用 PONG 回复传入的 PING(它们会在大约 5 分钟后发送)。但是在大约 3 分钟的不活动之后(所以在我得到 PING 之前)连接失败
socket.error: [Errno 104] Connection reset by peer
我使用 Python 中的 socket
模块进行连接。在我的套接字上调用 recv()
方法时发生错误。
我想通了一些事情:
在连接失败之前,他们没有传入(未应答)PING。
最后一条聊天消息和断开接缝之间的时间每次都在 3 分钟左右。它足以接收一些东西(链接其他人的聊天消息)来重置这个计时器。我不必自己发送任何东西。
我一开始以为我超时了,因为我太长时间没有收到任何东西了。情况似乎并非如此,因为如果我为 socket.recv()
设置较低的超时时间,我会收到 socket.timeout: timed out
,而不是上面显示的错误。
我想我不会错过任何发送给我的数据,因为所有聊天消息都会通过。但是我 post 我的主循环用于接收下面的数据只是为了确定。
我现在的问题是,为什么连接失败,我该如何防止这种情况?
我觉得这是一个模糊的问题。这是我第一次尝试使用 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'))
这里 s
是 socket()
形式的 socket
模块。
我自己每 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 中编写自己的机器人,通过其 IRC 界面连接 Twitch 聊天并与之交互。我有连接并且可以接收和发送数据。我还用 PONG 回复传入的 PING(它们会在大约 5 分钟后发送)。但是在大约 3 分钟的不活动之后(所以在我得到 PING 之前)连接失败
socket.error: [Errno 104] Connection reset by peer
我使用 Python 中的 socket
模块进行连接。在我的套接字上调用 recv()
方法时发生错误。
我想通了一些事情:
在连接失败之前,他们没有传入(未应答)PING。
最后一条聊天消息和断开接缝之间的时间每次都在 3 分钟左右。它足以接收一些东西(链接其他人的聊天消息)来重置这个计时器。我不必自己发送任何东西。
我一开始以为我超时了,因为我太长时间没有收到任何东西了。情况似乎并非如此,因为如果我为
socket.recv()
设置较低的超时时间,我会收到socket.timeout: timed out
,而不是上面显示的错误。我想我不会错过任何发送给我的数据,因为所有聊天消息都会通过。但是我 post 我的主循环用于接收下面的数据只是为了确定。
我现在的问题是,为什么连接失败,我该如何防止这种情况?
我觉得这是一个模糊的问题。这是我第一次尝试使用 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'))
这里 s
是 socket()
形式的 socket
模块。
我自己每 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 的提示。