Почему моя программа на python не отвечает на сообщения сокетов?

#python #sockets #networking #tcp #tcpclient

Вопрос:

Поэтому я арендую небольшой сервер для запуска игры, которую я создал. Это простая игра на python из командной строки. У меня просто проблема с тем, что сервер, похоже, не может распознавать мои сообщения.

Все брандмауэры и средства защиты были отключены до такой степени, что у меня заканчиваются возможности для отключения. Iptables был настроен так, чтобы принимать все, и сеть, похоже, работает нормально на обоих концах (я могу подключиться к серверу по SSH с нескольких компьютеров).

Теперь перейдем к запутанным частям. Используя wireshark и netsniffer-ng, я обнаружил, что пакеты принимаются. Когда вы впервые запускаете программу на стороне клиента, она запрашивает IP-адрес. Если вы даете ему правильный IP-адрес, он подключается нормально, а если вы даете ему неправильный, время ожидания истекает, поэтому сервер демонстративно находится в сети. После подключения вам будет предложено ввести имя пользователя и пароль. Как только вы их отправите, они просто замерзнут. Консоль на сервере не показывает никаких признаков входящего сообщения, но netsniffer-ng видит, что сообщения поступают.

Код находится здесь: https://pastebin.com/iN8UyW62 (Это не весь код, только соответствующие части)

Если я запускаю код в локальной сети или на локальном хосте, он работает без проблем, так что это не опечатка или что-то в этом роде. О, это также TCP-сервер.

У кого-нибудь есть какие-либо идеи, что может быть причиной этого?

При необходимости я могу предоставить дополнительную информацию.

Простую демонстрационную версию клиент/сервер можно использовать, добавив в файл библиотеки следующее, а затем запустив ее:

 if __name__ == "__main__":
def server():
    # Ask the user for the port to listen on
    port = int(input("port: "))
    # Initialise the class to listen on said port
    server = TCP_Server(port=port)
    # Start listening for clients
    server.listen_client_connections()
    # Printing off the servers ip address
    print(server.ip)

    # A list of the client connections
    connections = []

    while True:
        # For every new client connection
        for new_connection in server.get_new_connections():
            # Add them to the list of connections
            connections.append(new_connection)

        # For every connected client
        for connection in connections:
            # Try and get a message
            message = server.get_message_from(connection)
            # If there is a message
            if message != None:
                # Add the ip to the message
                message = f"{server.get_address_for(connection)[0]}: {message}"
                print(message)
                # For every connected client
                for reception in connections:
                    # If not the client that sent the message
                    if connection != reception:
                        # Send the message
                        server.send_message_to(reception, message)

def client():
    # Ask the user for the ip of the server
    ip = input("ip: ")
    # Ask the uesr for the port to listen on
    port = int(input("port: "))
    # Initialise the class to listen on said port
    client = TCP_Client(port=port)

    # Attempt to connect to the server
    try:
        client.connect_to(ip)
    except ConnectionRefusedError as e:
        print(f"{e}nPlease restart and try again")
        exit()
    except TimeoutError as e:
        print(f"{e}nPlease restart and try again")
        exit()

    choices = """1 = Send message
 

2 = Получать сообщения
==========»»»

     # If connection succeeded
    while True:
        # Display choices
        print(choices)
        # Get user input
        choice = input(">>> ")
        # If sending a message
        if choice == "1":
            # Get the message
            message = input("> ")
            print("-" * 10)
            # Send it
            client.send_message(message)
        # If receiving messages
        elif choice == "2":
            print("-" * 10)
            while True:
                # Get a message
                message = client.get_message()
                # If there is no message exit
                if message == None:
                    break
                # Else display message and check again
                print(message)

print("1 = Servern2 = Client")
choice = input(">>> ")
if choice == "1":
    server()
elif choice == "2":
    client()