Python Автоматическое переподключение сокета - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в Python. Поэтому я хотел сделать так, чтобы если сервер выключился, отключился, клиент просто продолжал подключаться, пока сервер снова не откроется. Я получаю такую ​​ошибку: File "C:\Users\Laurynas\Desktop\project\client.py", line 24, in reconnect server1.connect((HOST, PORT)) OSError: [WinError 10056] A connect request was made on an already connected socket Текущий client.py код:

import socket
import time
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


HOST = socket.gethostbyname(socket.gethostname())
PORT = 8888

# Check at the first try
def connect():
    try:
        server.connect((HOST, PORT))
        messages()
    except ConnectionRefusedError:
        print("reconnecting, please wait...")
        time.sleep(0.1)
        connect()

# Check at the second, third, etc.
def reconnect():
    try:
        server1.connect((HOST, PORT))
        messages()
    except ConnectionRefusedError:
        print("reconnecting, please wait...")
        time.sleep(0.1)
        reconnect()
        

def messages():
    while True:
        try:
            command = server.recv(1024).decode()
            print(command)
        except:
            reconnect()
            pass
connect()

1 Ответ

0 голосов
/ 03 августа 2020

За исключением сокетов прослушивания, которые используются для многих приемов, сокеты данных не могут быть повторно подключены и повторно использованы. На стороне клиента необходимо создать новый сокет для нового соединения, а на стороне сервера необходимо сделать новое принятие. Старые сокеты также должны быть закрыты, чтобы вывести их из ядра.

Это создает трудности, потому что сервер не будет автоматически знать, какой клиент повторно подключается и какие действия более высокого уровня следует перезапустить. Это должно быть встроено в протокол, который вы реализуете поверх соединения. В HTTP, например, каждый GET / PUT / POST повторно идентифицирует себя, чтобы веб-сервер знал, как это сделать, возможно, используя идентификатор сеанса на основе cook ie.

Итог, вы не можете продолжать позвонив по номеру server.connect, чтобы запустить его снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...