Открытие сокета для внешнего компьютера с помощью Python

#python #sockets #networking #network-programming

#python #сокеты #сеть #сетевое программирование

Вопрос:

Я использую следующий код, чтобы открыть сокет на моем компьютере. Когда я перехожу к my_ip: 5000 на своем компьютере, программа отвечает. Однако, когда я использую другой компьютер, ничего не происходит.

 HOST = 'my_ip'                 # Symbolic name meaning the local host
PORT = 8000              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()
 

Я не уверен, связано ли это с брандмауэром или нет. Когда я запускаю тестовый сервер в django, используя manage.py runserver my_ip:8000 , я могу подключиться к машине с другого компьютера. Я не уверен, что заставляет меня не иметь возможности подключиться с другого компьютера, используя приведенный выше код…

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

1. ping my_ip работает с этой машины?

2. Вы пытаетесь связаться с сервером из-за пределов вашей локальной сети? Если это так, проверьте, правильно ли вы перенаправили порт. Если вы пытаетесь получить к нему доступ с компьютера в той же сети, обязательно используйте внутренний IP, а не внешний.

3. Да, когда я ввожу my_ip на компьютер приведенный выше код, он работает. Однако, когда я использую другую машину, ничего.

4. Я пытаюсь получить к нему доступ извне сети

Ответ №1:

Установив значение HOST 'my_ip' равным, вы можете прослушивать частный IP-адрес, который разрешается только на вашем компьютере для вашего компьютера. Наиболее известный пример 127.0.0.1 . Вместо этого передайте пустую строку ( HOST='' ) для прослушивания любых запросов, поступающих на указанный порт. Убедитесь, что на обеих машинах используется один и тот же номер порта, то есть 5000 или 8000.

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

Чтобы проверить, доступен ли ваш компьютер в принципе, запустите python -m SimpleHTTPServer каталог без личной информации на сервере и попытайтесь связаться с веб-сервером, запущенным с помощью клиента.

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

1. Спасибо за ответ. Я попробовал -m SimpleHTTPServer , и он работал на локальном компьютере, но не на удаленном компьютере. В Django, когда я запускаю manage.py runserver my_ip:8000 , я могу использовать удаленный компьютер для доступа к файлам. Может ли это быть проблемой с брандмауэром? Я использую Windows 7.

2. @AlexisK Да, это определенно может быть локальный брандмауэр. Результат запуска django и запуска SimpleHTTPServer определенно должен быть одинаковым. Вы уверены, что IP указан правильно? Кстати, вы можете использовать средство сброса пакетов, такое как wireshark (потенциально на обеих машинах), для отладки проблемы.

3. Да, я запустил django и SimpleHTTPServer, которые должны быть одинаковыми, но по какой-то причине это не так: ( Я попробовал SimpleHTTPServer в той же папке, в которой я запускал runserver, и это не сработало.

4. @AlexisK Это сильно указывает на брандмауэр. Работает ли это, если вы временно отключите брандмауэр Windows? Что отображает wireshark?

5. Я отключил брандмауэр и такое же поведение. runserver работает так, как ожидалось, SimpleHTTPServer этого не делает. ;( SimpleHTTPServer говорит «Обслуживающий HTTP на 0.0.0.0 порт 8000»

Ответ №2:

Код выглядит правильным, поэтому ваша проблема заключается в другом (возможно, проблема с брандмауэром или проблема dns для «my_ip»).