#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()