Как заставить два андроид устройства общаться через TCP - PullRequest
22 голосов
/ 24 декабря 2010

Мы хотим установить TCP / IP-соединение между двумя устройствами Android.Пока мы думали, что будет проще, если мы сделаем подключение устройства к устройству.Таким образом, между этими двумя телефонами нет сервера.

В большинстве случаев (если не всегда) один не имеет реального IP-адреса (NAT и т. Д.).Это проблема для создания сокета TCP?Мне не удалось найти точную информацию для этого.Любые советы и мнения будут высоко оценены.

Спасибо

Ответы [ 5 ]

10 голосов
/ 17 мая 2011

Это проблема для создания TCP гнездо

Ответ - нет, это не делает его невозможным (если только у NAT нет непредсказуемого способа отображения IP-адресов). Однако это не просто сделать.

Короткий ответ: вам всегда будет нужен сервероподобный одноранговый узел с публичным IP-адресом, чтобы облегчить первоначальный обмен данными между узлами, расположенными за NAT. Сверстники подключаются к нему. A сообщает серверу, что он хочет установить TCP-соединение с B. Сервер уведомляет B. Выполнен анализ поведения NAT, и, если возможно, A и B пытаются открыть TCP-соединения друг с другом, предсказывая следующее сопоставление other NAT , Если все идет хорошо (и обычно это происходит), A касается базы с помощью B или наоборот. Они закрывают другие попытки подключения и связываются с действующим соединением TCP. Этот метод называется STUN для TCP.

Теперь, есть более сложная причина, почему все может пойти не так. Если вы хотите узнать больше, я написал книгу под названием Practical JXTA II, которая доступна для чтения онлайн на Scribd. Есть глава, посвященная прохождению NAT.

Надеюсь, это поможет.

0 голосов
/ 20 мая 2011

Возможно, но вы можете испытать некоторые проблемы.Прежде всего вы должны знать публичный адрес хоста, с которым вы хотите связаться, и если ваши два хоста находятся в разных сетях NATTED, вы должны сделать это с использованием какого-либо сервера (как вы делаете это в SIP-телефонии).Тогда вы должны надеяться, что подключенный хост находится за «хорошим» NAT, таким как «полный конус» или аналогичный, а не за «плохим» NAT, как «симметричный», который не допускает входящее соединение.Тот факт, что вы используете TCP-соединение вместо UDP-дейтаграммы, может помочь вам из-за трехстороннего рукопожатия.Фактически большинство маршрутизаторов NAT принимают входящее TCP-соединение, но не входящие UDP-пакеты.

0 голосов
/ 19 мая 2011

Если оба узла не имеют глобальных IP-адресов (и физически не находятся в одной сети), то невозможно обмениваться данными по TCP без сервера, если вы не создали управляющий сервер, который действует как ретранслятор, сообщающий узлам о любых изменениях, происходящих на другой стороне

0 голосов
/ 25 декабря 2010

Хорошо, чтобы сделать сокет TCP, одно устройство должно прослушивать, а другое подключаться.Однако в реальном сценарии то, что вы описываете, довольно сложно.Например, если вы собираетесь связываться по сотовой сети между двумя телефонами, я не удивлюсь, если сеть не разрешит входящие соединения с таким телефоном и просто изолирует IP-адрес каждого телефона.Таким образом, хотя два телефона могут находиться в одном диапазоне IP-адресов подсети, они могут не находиться в одной физической сети, что делает проблему маршрутизации практически невозможной.

Если вы управляете сетью и используете Wi-Fi и самостоятельно настраиваете IP-адреса на обоих устройствах в вашей сети, вы сможете сделать это так же, как и любой другой сокет TCP-сервера клиента.

0 голосов
/ 24 декабря 2010

Одно устройство за NAT не является проблемой.Требование: сервер должен быть доступен клиенту.

Я использую Apache Mina для обработки TCP-соединений.Это действительно сделало мою жизнь проще.Может использоваться как на клиенте, так и на сервере.Попробуйте ...

...