Сервер сокетов Python не принимает ответа

#python #sockets #server

#python #сокеты #сервер

Вопрос:

Я пытаюсь подключиться к своему серверу Linux с компьютера Windows через сокет python. Однако socket.accept() на стороне сервера, похоже, не реагирует на подключение клиента.

Сервер:

 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 8080))
s.listen()
print("listening...")
conn, address = s.accept()
print("Connection from "   address[0]   ":"   str(address[1]))
 

Клиент:

 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((<my server ip>, 8080))
client_socket.send(bytes("hello", "utf-8"))
 

Ожидаемое поведение:
Сервер:

 Listening...
Connection from <my local ip>:<local ip port>
 

Фактическое поведение:

 Listening...
 

Другие результаты:

  1. ping <my server ip> с локального компьютера успешно.
  2. Клиентский код выполняется до конца без ошибок.
  3. sudo lsof -ni tcp:8080 на сервере указан мой процесс, который прослушивает порт 8080.

Что может пойти не так?

Спасибо.

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

1. Пожалуйста, опишите точное поведение, которое вы ожидаете, и что вы получаете вместо этого, т. Е. Сообщения об ошибках, поведение кода и т. Д. Также обратите внимание, что «… похоже, что соединение выполнено успешно, и некоторые сообщения прошли «. на самом деле не имеет особого смысла — если вы случайно не подключитесь к другой службе. Но опять же, пожалуйста, не просто интерпретируйте результаты (и, возможно, неправильно), а покажите фактические детали того, что происходит. Возможно, имеет смысл добавить в ваш код еще несколько выходных данных отладки, чтобы на самом деле увидеть, что происходит, т. Е. Особенно, Если connect клиент преуспел.

2. вы запускаете его в той же сети? Возможно, клиент подключается к другому компьютеру. Если вы подключаетесь из Интернета, то вы подключаетесь к маршрутизатору вашего интернет-провайдера — и ему придется перенаправить его на ваш сервер (но обычно интернет-провайдеры блокируют этот доступ для вашей безопасности) Часто провайдеры держат открытыми порты, такие как 80, 8000, 8080, и лучше использовать их вместо портов, таких как 30000. Кстати: проверьте, что вы получаете socket.gethostname() — возможно, он получает 127.0.0.0 , а затем не принимает внешние подключения. Лучше использовать 0.0.0.0 на сервере.

3. @SteffenUllrich спасибо за ваше предложение! Я добавил дополнительную информацию в описание. У вас есть идея о том, как отладить client_socket? Я позвонил client_socket.getpeername() , и он возвращает IP-адрес и порт моего сервера.

4. @furas благодарю вас за ваше предложение! socket.gethostname() дает мне строковое имя, но socket.gethostbyname(socket.gethostname()) возвращает 127.0.0.1 — почему это означает, что он не будет принимать внешние подключения? Есть ли способ, которым я могу это перенастроить?

5. Использовать s.bind(('',8080)) на сервере. Сервер будет принимать соединения из любого интерфейса.