Обнаружение отключения клиента без отправки ЛЮБЫХ данных на сервер - PullRequest
0 голосов
/ 17 января 2020

Я пытаюсь определить, отключен ли клиент от сервера.

ТОЛЬКО сервер отправляет информацию клиенту.
Клиент - просто слушатель, он получает информацию.

Я не могу сделать клиента 'сервером' 'и сервер' клиент ', потому что будет около 10 клиентов, которые подключаются к серверу, а сервер
отправляет им информацию, но не постоянно . Только когда пользователь нажимает кнопку.
Так что я нахожу эту задачу действительно сложной, и я не могу ничего найти там, потому что мой случай, на мой взгляд, необычный. Я пробовал с socket.recv(1024), но, как я уже сказал, между клиентом и сервером нет непрерывной связи. Код потока сервера (он наследуется от QObject, потому что я использую PyQt 5):

class ServerThread(QObject):

    def __init__(self):
        print("(DEBUG) WATEK PROGRAMU URUCHOMIONY")
        QObject.__init__(self)

    def receive_msg(self, client_soc):
        try:
            message_header = client_soc.recv(HEADER_LENGTH)

            if not len(message_header):
                return False

            message_length = int(message_header.decode("utf-8"))
            return {"header": message_header, "data": client_soc.recv(message_length)}
        except:
            return False

    def thread_runner(self):
        global client_socket
        global client_address
        global sockets_list
        global server_soc

        while True:
            read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)

            for notified_socket in read_sockets:
                if notified_socket == server_soc:
                    client_socket, client_address = server_soc.accept()

                    connected_clients.append(client_socket)

                    clients[client_socket] = client_address

                    print(
                        f"(DEBUG) Accepted new connection from {client_address[0]}:{client_address[1]}")
                else:
                    msg = self.receive_msg(notified_socket)
                    if not msg:
                        print(
                            f"(DEBUG) Closed connection from {notified_socket.gethostbyname(socket.gethostname())}")
                        sockets_list.remove(notified_socket)
                        del clients[notified_socket]

            for notified_socket in exception_sockets:
                sockets_list.remove(notified_socket)
                del clients[notified_socket]

Код клиента:

while True:
    try:
        msg_header = client_soc.recv(HEADER_LENGTH)
        msg_length = int(msg_header.decode('utf-8'))
        msg = client_soc.recv(msg_length).decode('utf-8')
        print(msg)

        if LINK_SIG in msg:
            msg_list = msg.split("|<->|")
            link = msg_list[1]
            print(f"(DEBUG) {LINK_SIG} SIGNAL RECEIVED: {link}")
            link_received(link)

        if msg == LOCK_PC:
            print(f"(DEBUG) {LOCK_PC} SIGNAL RECEIVED")
            lock_pc(True)
        elif msg == BLOCK_KEYBOARD:
            print(f"(DEBUG) {BLOCK_KEYBOARD} SIGNAL RECEIVED")
            blocker = KeyboardBlocker(True)
            blocker.start()
        elif msg == BLOCK_MOUSE:
            print(f"(DEBUG) {BLOCK_MOUSE} SIGNAL RECEIVED")
            block_mouse(True)

        if msg == UNBLOCK_KEYBOARD:
            print(f"(DEBUG) {UNBLOCK_KEYBOARD} SIGNAL RECEIVED")
            blocker = KeyboardBlocker(False)
            blocker.start()
        elif msg == UNBLOCK_MOUSE:
            print(f"(DEBUG) {UNBLOCK_MOUSE} SIGNAL RECEIVED")
            block_mouse(False)

    except IOError as e:
        if e.errno != errno.EAGAIN and e.errno != errno.EWOULDBLOCK:
            print("(ERROR) Reading error!", str(e))
            sys_exit()

    except Exception as e:
        print("(ERROR) General error!", str(e))
        sys_exit()

Мне действительно нужна помощь в этом, и возможно ли это вообще? Должен ли я сделать рефакторинг своего кода, чтобы он работал? Что мне делать?

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