Сделать Python-сокеты видимыми для внешнего мира? - PullRequest
2 голосов
/ 24 июня 2010

У меня уже есть пост, который довольно похож, но я становлюсь все более и более разочарованным, потому что, кажется, нет ничего плохого в моей настройке сети. Другое программное обеспечение можно увидеть снаружи (серверы прослушивания netcat и т. Д.), Но не мои сценарии. Как это может быть ?? Примечание: он работает в локальной сети, но не через Интернет.

Сервер:

import socket

host = ''
port = 80001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
print 'Listening..'
conn, addr = s.accept()
print 'is up and running.'
print addr, 'connected.'
s.close()
print 'shut down.'

Клиент:

import socket
host = '80.xxx.xxx.xxx'
port = 80001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.close()

Кто-нибудь, пожалуйста, помогите мне.

Любая помощь очень ценится.

Jake

Ответы [ 2 ]

7 голосов
/ 24 июня 2010

Отредактировано снова, чтобы добавить:

Думаю, вам не хватает некоторых основ связи с сокетами. Чтобы сокеты работали, необходимо убедиться, что сокеты на вашем клиенте и сервере будут соответствовать. С последней версией ваш сервер теперь привязан к порту 63001, но на локальном адаптере обратной связи: 127.0.0.1

Компьютеры имеют несколько сетевых адаптеров, по крайней мере, 2: один - локальный шлейф, который позволяет быстро и эффективно выполнять сетевые подключения к одной и той же машине (для тестирования, ipc и т. Д.), И сетевой адаптер, Вы подключаетесь к реальной сети. Многие компьютеры могут иметь гораздо больше адаптеров (виртуальные адаптеры для vlans, беспроводные или проводные адаптеры и т. Д.), Но их будет не менее 2.

Итак, в вашем серверном приложении вы должны указать ему, как привязать сокет к соответствующему сетевому адаптеру.

host = ''
port = 63001


bind(host,port)

То, что это делает в python, привязывает сокет к адаптеру обратной связи (или 127.0.0.1/localhost).

В вашем клиентском приложении у вас есть:

host = '80.xxx.xxx.xxx'
port = 63001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))

Теперь ваш клиент пытается подключиться к сокету к порту 63001 на 80.xxx.xxx.xxx (который является вашим беспроводным интернет-адаптером).

Поскольку ваш сервер прослушивает ваш петлевой адаптер, а ваш клиент пытается подключиться к вашему беспроводному адаптеру, происходит сбой, потому что два конца не сходятся.

Итак, у вас есть два решения:

  1. Изменить клиента для подключения к localhost с помощью host = 127.0.0.1
  2. Измените сервер для привязки к вашему интернет-адаптеру, изменив host = 80.xxx.xxx.xxx

    Теперь первое решение, использующее localhost, будет работать только тогда, когда ваш сервер и клиент находятся на одном компьютере. Localhost всегда указывает на себя (следовательно, на петлю), независимо от того, какую машину вы пытаетесь. Поэтому, если / когда вы решите подключить ваш клиент / сервер к Интернету, вам нужно будет подключиться к сетевому адаптеру, который находится в Интернете.

Отредактировано, чтобы добавить: **

Хорошо, с вашей последней ревизией, она все равно не будет работать, потому что 65535 является самой большой доступной записью.

Ниже приведен ответ на первоначальный вариант вопроса.

В опубликованном коде вы прослушиваете (привязаны) порт 63001, но ваше клиентское приложение пытается подключиться к порту 80. Вот почему ваш клиент не может общаться с вашим сервером. Ваш клиент должен подключиться через порт 63001, а не порт 80.

Кроме того, если вы не используете HTTP-сервер (или ваш Python-сервер будет обрабатывать HTTP-запросы), вам не следует связываться с портом 80.

В вашем клиенте изменение кода:

import socket
host = '80.xxx.xxx.xxx'
port = 63001

И в вашем коде сервера:

import socket

host = ''
port = 63001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostbyname(socket.gethostname()), port ))
1 голос
/ 24 июня 2010

В вашем серверном скрипте у вас есть port = 80, но вы никогда его не используете.Похоже, что сервер прослушивает 63001. А клиент подключается к 80.

Если вы собираетесь использовать 80, убедитесь, что у вас нет http-сервера, пытающегося использовать порт нав то же время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...