python - Python IRC Bot静默超时(?) - 突然停止工作
问题描述
我最近开始编写自己的 IRC Bot,没什么花哨的,只是读取频道并发布特定命令的文本文件内容。
# let's connect
irc_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
irc_socket.connect((server, 6667))
# now we login and send a test message
irc_socket.send(str.encode('PASS ' + pw + '\r\n'))
irc_socket.send(str.encode('NICK ' + bot + '\r\n'))
irc_socket.send(str.encode('USER ' + bot + '\r\n'))
irc_socket.send(str.encode('JOIN #' + channel + '\r\n'))
while 1:
text = irc_socket.recv(2040).decode()
if text.startswith('!ideen'):
do stuff #lot of code, shouldn't be of importance
奇怪的是,一切都按我的意愿工作,但由于某些原因,它在一段时间后停止工作。它不会超时或给出任何错误,它只是完全停止反应。首先,我认为它会因过多的消息而过载,但如果频道只是空置 20 分钟左右,也会发生这种情况。当我从 Pycharm 或命令行运行它时,也会发生同样的情况(不知道为什么它会有所作为)。
我可能不是唯一有问题的人,但我找不到任何东西。感谢您的帮助,甚至是有关如何调试此类内容的提示。
IRC 频道是一个 Twitch-IRC 聊天,如果这很重要的话。
编辑:尝试@matt-m 提示进行调试,似乎他停止收到消息。文本消息始终是空字符串。
解决方案
您可能没有响应带有 的服务器PING
吗PONG
?
https://www.rfc-editor.org/rfc/rfc2812#section-3.7.2
如果连接未能在设定的时间内响应 PING 消息,则该连接将关闭。
所以你应该确保你这样做。我认为当连接关闭时它会引发一些套接字错误,但根据How to tell if a connection is dead in python,情况可能并非总是如此。
推荐阅读
- postgresql - PSQL:在调用的触发器中使用 Where 子句
- sql - 使用数据库名称而不是模式名称获取列和行
- jpa - JTA和JPA,通信
- c# - 为什么 C# 比较 C# 中“相同”的浮点数不同
- jquery - 如何显示最多 4 个块,然后单击按钮显示所有块?
- sql-server - 无法连接到 sqlserver docker 映像
- sling - jackrabbit accessmanager:如何创建具有限制 rep:glob="/foo" 的 ACL
- encryption - 如何恢复和解密被 Grandcrab 勒索软件病毒加密的文件
- javascript - 当我单击按钮组中的按钮时更改许多按钮的值(文本)
- salesforce - Salesforce 个案评论更新创建者姓名