#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...
Другие результаты:
ping <my server ip>
с локального компьютера успешно.- Клиентский код выполняется до конца без ошибок.
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))
на сервере. Сервер будет принимать соединения из любого интерфейса.