Python сервер с сокетом использует много процессорного времени - PullRequest
0 голосов
/ 14 апреля 2020

Начал изучать модель клиент-сервер и теперь пытался сделать крошечную многопользовательскую игру просто для практики. До сих пор мне удалось установить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...