@HE_TYPOY

Клиент, запущеный раньше сервера к нему не подключаеться. Как исправить?

Есть 2 скрипта. Сервер и клиент. Когда запускаю сначала клиента, потом сервер, то подключается через секунды 2-3(или вообще не подключается ), когда я перезапускаю сервер(когда клиент работает), то клиент не подключаеться, если и его не перезапустить.

Сервер:
import socket
import threading
server_ip = "192.168.0.108"
server_port = 12345
server_addr = (server_ip,server_port)
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(server_addr)
format = "utf-8"
class handle_client:
    connected = False
    def __init__(self,conn,addr):
        self.conn = conn
        self.addr = addr
        self.connected = True
        self.handle()
    def execute_command(self,command):
        if(type(command) == dict):
            if(command["command"] == "disconnect"):
                self.connected = False
                print(f"[{self.addr}] disconnected from server!")
    def handle(self):
        while self.connected:
            data = self.conn.recv(1024).decode(format)
            command = eval(data)
            print(f"[{self.addr}] sended command/message {command}")
            self.execute_command(command)
        self.conn.close()
server.listen()
while True:
    conn, addr = server.accept()
    threading.Thread(target=handle_client,args=(conn,addr),daemon=True).start()
    print(f"[{addr}] connected to server!")


Клиент:
import socket
import threading

server_ip = "192.168.0.108"
server_port = 12345
server_addr = (server_ip,server_port)

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.settimeout(0.4)
format = "utf-8"
def try_connect():
    while True:
        try:
            client.connect(server_addr)
        except Exception as e:
            print(e)

threading.Thread(target=try_connect,daemon=True).start()

while True:
    command = input()
    if (command == "quit"):
        data = {"command": "disconnect", "args": {}}
        try:
            client.send(str(data).encode(format))
        except:
            pass
        exit()


& в PyCharm`е чтобы закрыть сервер нужно 2 раза жать на кнопку остановки.
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Я не понял зачем ты пытаешься подключиться к серверу в отдельном потоке. Если это критично, почитай про неблокирующие операции на сокетах, и как ими пользоваться.

Да ещё и глотаешь исключения. Очень не советую писать except: pass, у тебя вместо сколь-нибудь понятного сообщения об ошибке программа будет молча не работать.

В любом случае ты делаешь только одну попытку подключения. Поток выполнит try_connect() один раз и завершит работу. Отсюда и наблюдаемое поведение - клиент не переконнектится, потому что в коде это не прописано.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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