@pavelpasha

Почему не восстанавливается соединение с сервером после долгого разрыва?

На удаленном распбери крутится код собирающий и передающий данные на сервер. При разрыве соединения идет бесконечное переподключение, но если связи небыло очень долго, около суток например - то процедура переподключения где-то блокируется или висит. Сложно понять что именно произошло. Я подключаюсь по SSH, вижу работающий код, вижу как он собирает данные, но не вижу попыток подключения к серверу. (сбор данных и отправка работают в разных потоках). Если разрыв был не долгим - пару часиков допустим, то нет проблем.

def connectToServer ():
    print("Server: connecting")
    global ServerSock
    try:
        ServerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ServerSock.settimeout(10)
        ServerSock.connect((ServerHost, ServerPort))
        ServerSock.settimeout(10)
        print("Server: connected")
    except:
        print("error occured")
        ServerSock.close()
        time.sleep(5)
        connectToServer()



def runServerSending ():
    connectToServer()
    while True:
            try:
                ServerSock.sendall(json.dumps(this.__dict__).encode())
                answer = ServerSock.recv(1024)
                if not answer:
                    raise Exception('Server socket error')
            except:
                print("Server: send data error")
                ServerSock.close()
                connectToServer()
            time.sleep(10)
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
@Meonn
Возможно у тебя переполняется буффер из-за рекуррентного вызова connectToServer()
def connectToServer ():
    ....
    except:
        print("error occured")
        ServerSock.close()
        time.sleep(5)
        connectToServer()


Попробуй так:
def connectToServer ():
    print("Server: connecting")
    global ServerSock
    connected = False
    while not connected:
        try:
            ServerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ServerSock.settimeout(10)
            ServerSock.connect((ServerHost, ServerPort))
            ServerSock.settimeout(10)
            print("Server: connected")
            connected = True
        except:
            print("error occured")
            ServerSock.close()
            time.sleep(5)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы