«Сброс соединения по узлу» при использовании Twitch IRC в Python

Я пытаюсь написать своего собственного бота на Python для подключения и взаимодействия с Twitch-чатом через его IRC-интерфейс. У меня есть соединение и я могу получать и отправлять данные. Я также отвечаю на входящие запросы PING с помощью PONG (они отправляются примерно через 5 минут). Но примерно через 3 минуты бездействия (так что, прежде чем я даже получу PING), соединение обрывается с

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

Я использую модуль socket в Python для соединения. Ошибка возникает, когда метод 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'))

Здесь s — это socket() форма модуля socket.

Вы пытались сделать так, чтобы вы отправляли PONG каждые, скажем, 2 минуты, даже если вы не получили пинг?

ChatterOne 10.04.2019 14:33

Похоже, это работает. Я просто отправляю тот же самый PING, который я получаю от сервера. Я не получаю обратно PONG, но это не проблема. Это "правильный" поступок или не имеет значения, что я отправляю?

Nereos 10.04.2019 14:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
565
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пингование сервера каждые 2 минуты решило проблему. Я просто добавил эту функцию

import time, threading

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

sendPing(s)

перед основным циклом.

Спасибо болтовня за подсказку.

Другие вопросы по теме

Похожие вопросы

Python - расширить фрейм данных по различиям для числовых столбцов с разделением по уникальным идентификаторам
Проблема с командой бана discord.py (переписать ветку)
Как добавить столбец (average_user_rating) в фрейм данных, который дает мне средний рейтинг для идентификатора пользователя в этой строке?
При получении «ValueError: недостаточно значений для распаковки (ожидалось 2, получено 1)», как я могу заставить программу игнорировать и продолжать?
Ошибка быстрого текста TypeError: supervisord() получил неожиданный аргумент ключевого слова «pretrainedVectors»
Как создать декоратор для метода
Количество доступных процессоров в Python
Как сохранить определенную часть json в переменной на основе определенного условия в Python?
Как я могу округлить число с плавающей запятой до фиксированных десятичных частей, используя python
Разделите строки в столбце и постройте график для кадра данных. питон