Как сделать два устройства Android для связи через TCP

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

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

Спасибо

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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