Почему программа сокета Python перестает работать при преобразовании в exe-файл?

#python #sockets

#python #сокеты

Вопрос:

Я написал онлайн-приложение для игры в шахматы, используя Python и сокеты. Когда я запускаю сервер и подключаю клиентов, все работает идеально гладко. Однако, когда я конвертирую клиент в exe-файл и запускаю его, клиент больше не может подключиться к серверу.

Я также пытался преобразовать сервер в исполняемый файл, и он тоже перестал работать. Я думаю, что у него проблемы с командным сервером.listen(), потому что вывод выполняется только при запуске сервера [STARTING] … (Более подробная информация приведена в коде на стороне сервера ниже)

Кто-нибудь сталкивался с проблемами при преобразовании приложения сокета в exe-файл? Я не получил никаких результатов при поиске в Google.

Сокращенный код на стороне клиента:

 import socket

HEADER = 64
PORT = 5050
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
NONE_MESSAGE = "!NONE"
OPPONENT_DISCONNECTED = "!OPPONENT_DISCONNECTED"
SERVER = "192.168.56.1"
ADDR = (SERVER, PORT)


def send(client, msg):
    message = msg.encode(FORMAT)
    msg_length = len(message)
    send_length = str(msg_length).encode(FORMAT)
    send_length  = b' ' * (HEADER - len(send_length))
    client.send(send_length)
    client.send(message)


def recieve(client):
    send(client, NONE_MESSAGE)
    msg_length = client.recv(HEADER).decode(FORMAT)
    if msg_length:
        msg_length = int(msg_length)
        msg = client.recv(msg_length).decode(FORMAT)
        if msg != NONE_MESSAGE:
            return msg
    return False
  

Код на стороне сервера:

 import socket
import threading
import random

HEADER = 64
PORT = 5050
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
NONE_MESSAGE = "!NONE"
OPPONENT_DISCONNECTED = "!OPPONENT_DISCONNECTED"

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(ADDR)


def recieve(conn):
    send(conn, NONE_MESSAGE)
    msg_length = conn.recv(HEADER).decode(FORMAT)
    if msg_length:
        msg_length = int(msg_length)
        msg = conn.recv(msg_length).decode(FORMAT)
        if msg != NONE_MESSAGE:
            return msg
    return False


def send(conn, msg):
    message = msg.encode(FORMAT)
    msg_length = len(message)
    send_length = str(msg_length).encode(FORMAT)
    send_length  = b' ' * (HEADER - len(send_length))
    conn.send(send_length)
    conn.send(message)


def get_opponent(addr):
    for c1, c2 in client_pairs:
        if c1 == addr:
            return c2
        if c2 == addr:
            return c1
    return None


def handle_client(conn, addr):
    global new_client
    global new_client_name
    name = recieve(conn)
    if new_client:
        print(f"[NEW CONNECTION] {addr} connected to {new_client}")
        client_pairs.append((new_client, addr))
        color = random.choice(['w', 'b'])
        send(conn, color new_client_name)
        if color == 'w':
            messages_to_send[new_client] = 'b' name
        else:
            messages_to_send[new_client] = 'w' name
        new_client = None
        new_client_name = None
    else:
        new_client_name = name
        new_client = addr
        print(f"[NEW CONNECTION] {addr} waiting")

    connected = True
    while connected:
        if addr in messages_to_send.keys():
            send(conn, messages_to_send[addr])
            del messages_to_send[addr]
        if addr in disconnects:
            send(conn, OPPONENT_DISCONNECTED)
            disconnects.remove(addr)
        msg = recieve(conn)
        if msg:
            if msg == DISCONNECT_MESSAGE:
                if new_client == addr:
                    new_client = None
                opponent = get_opponent(addr)
                if opponent:
                    disconnects.append(opponent)
                connected = False
            opponent = get_opponent(addr)
            if opponent:
                messages_to_send[opponent] = msg
            print(f"[{addr}] {msg}")

    conn.close()


new_client = None
new_client_name = None
messages_to_send = {}
client_pairs = []
disconnects = []


def start():
    server.listen()
    print(f"[LISTENING] Server is listening on {SERVER}")
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()
        print(f"[ACTIVE CONNECTIONS] {threading.activeCount()-1}")


print("[STARTING] Server is starting...")
start()
  

Комментарии:

1. Как именно вы создаете exe-файл?

2. «перестал работать» на самом деле мало что говорит. Было ли сообщение об ошибке или трассировка стека исключений? Она была запущена, но не развивалась, как ожидалось? Завершила ли она выполнение, не выполнив ожидаемого?

3. Я создаю exe-файл с помощью pyinstaller. С «перестал работать» я имею в виду, что он больше не перезапускался. Я думаю, что он застрял при попытке подключиться к серверу, потому что сервер не отвечал.

4. была такая же проблема с pyinstaller