limontasher
@limontasher
Начинающий программист

Не понимаю, почему код где-то застревает и не выполняется?

Написал небольшое сетевое приложение для сервера и клиента.

Задумка в том чтобы любые клиенты в любой момент могли отключаться и подключаться к серверу, поэтому такой мудренный код сервера, но, при запуске сервера и клиента, клиент подключается к серверу и не получает Connected от сервера, предположений в чем проблема очень мало, скорее всего в модуле threading или в моей невнимательности, за любую помощь большое спасибо. Код:

Сервера:
import socket
from threading import Thread
import json


def pass_check(list_id: list) -> int:
    last_number = 0

    for i in list_id:
        if i == 0:
            continue

        if i-1 != last_number:
            break

        last_number = i

    return last_number


IP = "192.168.43.228"
PORT = 10010

class Client:

    def __init__(self):
        self.dict_client = {}


    def add_client(self, id: int, conn, addr: tuple, nick:str):
        self.dict_client[id] = {"conn": conn, "addr": addr, "nick": nick}
        dict_thread[id] = Thread(target=listen_packet(conn, addr))
        dict_thread[id].start()

        print(self.dict_client)


    def delete_client(self, addr):
        self.dict_client.pop(addr)


client = Client()

def listen_client():
    while True:
        sock.listen(1)
        conn, addr = sock.accept()
        nick = conn.recv(64).decode("utf-8")
        client.add_client(pass_check(list(client.dict_client.keys())), conn, addr, nick)
        conn.send("Connected".encode("utf-8"))


def listen_packet(conn, addr):
    while True:
        packet = conn.recv(256)

        for id in client.dict_client:
            if client.dict_client["id"]["addr"] != addr:
                client.dict_client[id]["conn"].send(packet)

dict_thread = {}
sock = socket.socket()
sock.bind((IP, PORT))

thread_listen_client = Thread(target=listen_client())
thread_listen_client.start()


Клиент:
import socket
import json
from random import randint

sock = socket.socket()
sock.connect(("192.168.43.228", 10010))
sock.send("It's my nick!".encode("utf-8"))
print("отправил ник и жду ответа")


data = sock.recv(64)
print(data.decode("utf-8"))

if data.decode("utf-8") == "Connected":
    while True:
        packet = [ [randint(10000000, 50000000)/1.0,
                    randint(10000000, 50000000)/1.0,
                    randint(10000000, 50000000)/1.0],
                   [randint(-10000000, 10000000)/1.0, randint(-10000000, 10000000)/1.0],
                   randint(10000, 500000)/1.0 ]
        sock.send(json.dumps(packet).encode('utf-8'))

        data = sock.recv(256)
        print(json.loads(data, encoding='utf-8'))
  • Вопрос задан
  • 146 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
sock.listen(1)
listen() достаточно сделать 1 раз, чтобы переключить сокет в слушающий режим.
Параметр указывает, сколько клиентов могут одновременно ожидать ответа на попытку соединения. Если эта очередь переполнится (клиенты подключаются, а твоё приложение их не успевает принимать), то последующие клиенты автоматически получат отлуп вместо ожидания.

thread_listen_client = Thread(target=listen_client())
Ты запускаешь поток, телом которого является значение, возвращаемое функцией listen_client(). Т.е. функция listen_client() выполняется сразу же, а поток уже не запускается, так как возвращённый listen_client() None - это не функция. Осознай разницу между ссылкой на функцию (listen_client) и вызовом функции (listen_client()).

Ну и наконец, у тебя listen_client() обслуживает клиента, и только потом пытается принять следующее подключение. Как следствие, клиенты будут обслуживаться только по одному (хотя в твоём случае обслуживание очень быстрое и это будет незаметно). Смысл вообще городить потоки?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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