Начал изучать модель клиент-сервер и теперь пытался сделать крошечную многопользовательскую игру просто для практики. До сих пор мне удалось установить sh связь между клиентом и сервером, но он использует слишком много процессорного времени, потому что сервер постоянно пытается получать сообщения, которые в большинстве случаев будут пустыми (нет). Мне интересно, как это исправить, то есть, какое решение лучше? Чтобы перевести сервер в спящий режим на некоторое время (в миллисекундах), каким-либо образом перевести сервер в неактивный режим, пока не возникнет активность в сети (если что-то подобное возможно) или что-то еще? Спасибо! Вот код:
Server.py:
import socket
import threading
import pickle
HEADER = 8 #Contains info about incoming msg SIZE! first 8 bytes contains size
FORMAT = "utf-8"
PORT = 5558
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
DISCONNECT_MSG = "!Disconnect"
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(ADDR)
def handle_client(client_socket, client_addr):
print(f"[NEW CONNECTION] {client_addr} connected!")
while True:
try:
msg = client_socket.recv(2048)
if msg:
new_msg = pickle.loads(msg[HEADER:])
print(f"[RECEIVED] {client_addr} - {new_msg}")
if msg == DISCONNECT_MSG:
print(f"[DISCONNECTED] client {client_addr} has disconnected")
client_socket.close()
return False
except socket.error as e:
print(e)
def start_server(server):
server.listen()
print("[STARTED] server is online!")
while True:
client_socket, client_addr = server.accept()
thread = threading.Thread(target=handle_client, args=(client_socket, client_addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")
print("[STARTING] server is starting...")
start_server(server_socket)
Client.py:
import socket
import pickle
HEADER = 8
FORMAT = "utf-8"
PORT = 5558
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
DISCONNECT_MSG = "!Disconnect"
class Client:
def __init__(self):
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def connect_to_server(self, server_address):
"""
:param server_address: tuple(IP, PORT)
:return:
"""
self.get_client_socket().connect(server_address)
def get_client_socket(self):
return self.client_socket
def send_object(self, object):
msg = pickle.dumps(object)
msg = bytes(f"{len(msg):<{HEADER}}", FORMAT) + msg
print(msg)
self.get_client_socket().sendall(msg)
time.sleep(0.1)
client = Client()
client.connect_to_server(ADDR)
d = [1, 2, 3, 4, 8]
client.send_object(d)
#client.send_object(DISCONNECT_MSG)