Я пытаюсь определить, отключен ли клиент от сервера.
ТОЛЬКО сервер отправляет информацию клиенту.
Клиент - просто слушатель, он получает информацию.
Я не могу сделать клиента 'сервером' 'и сервер' клиент ', потому что будет около 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()
Мне действительно нужна помощь в этом, и возможно ли это вообще? Должен ли я сделать рефакторинг своего кода, чтобы он работал? Что мне делать?