2016-11-29 2 views
1

Я делаю приложение, которое позволяет двум устройствам подключаться через сокет. Один из них создает точку доступа и serversocket, другое устройство может присоединиться к этой точке доступа и подключиться к этому serversocket.Сокет не будет создан, если данные на

Все работает нормально (на самом деле на устройствах Nougat оно генерирует исключение сети Unreachable, но я решил его с повторением, и это нормально), но IF данные 3g/4g включены, он просто не будет подключаться, это будет застрял (на socket = new Socket(ip,port) и через некоторое время она бросаетConnectException _ Connection timed out.

Вот полный стек для ошибки:

java.net.ConnectException: Connection timed out 
    W/System.err:  at java.net.PlainSocketImpl.socketConnect(Native Method) 
W/System.err:  at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334) 
    W/System.err:  at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:196) 
    W/System.err:  at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178) 
    W/System.err:  at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356) 
    W/System.err:  at java.net.Socket.connect(Socket.java:586) 
    W/System.err:  at java.net.Socket.connect(Socket.java:535) 
    W/System.err:  at java.net.Socket.<init>(Socket.java:427) 
    W/System.err:  at java.net.Socket.<init>(Socket.java:210) 

EDIT: Я знаю, что есть подобные вопросы здесь, но ни один из они связаны с мобильные данные (по крайней мере, я их не нашел), они просто общие.

+1

Когда оба устройства находятся в одной и той же области Wi-Fi, они могут подключаться напрямую, независимо от того, имеет ли сервер публичный IP-адрес или нет. Но если вы подключаете более 3g/4g, то сервер должен иметь глобальный публичный IP-адрес. Есть ли у него? –

+0

Нет, у меня нет ip. Цель состоит в том, чтобы общаться через горячую точку.Таким образом, идеальным сценарием был бы кто-то, кто подключился бы к точке доступа, которая была создана другим устройством, а затем, когда я подключился к этой сети, я получаю IP-адрес сервера из этой сети и пытаюсь создать сокет с этим IP-адресом. –

+1

Тогда ответ @ Vovanrock ниже может быть правильным ответом на ваш вопрос. –

ответ

2

Когда конечное устройство (пользовательское устройство) хочет отправить что-то удаленному одноранговому узлу, оно обычно ничего не знает о сети между ними. Все устройство имеет набор сетевых интерфейсов (Wi-Fi, сотовая связь, bluetooth) и таблица маршрутизации.

Большинство интерфейсов уже должны иметь IP-адрес, назначенный устройством (для Wi-Fi) или сотовым оператором (для 3g/4g).

Когда что-то нужно отправить по IP x.x.x.x, устройство просматривает таблицу маршрутизации, пытаясь найти какой интерфейс использовать. Если ничего не найдено (это скорее всего сценарий на самом деле), используется по умолчанию маршрут (шлюз).

В вашем случае вероятно, что по умолчанию шлюз говорит, что устройство должно отправить данные через 3g/4g, когда передача данных включена. Когда он выключен, шлюз по умолчанию изменяется на использование Wi-Fi, единственного активного сетевого интерфейса в этот момент времени.

У вас есть четыре варианта того, как преодолеть это.

  1. Когда у вас есть два интерфейса (Wi-Fi и 4g), каждый интерфейс получает свой собственный IP-адрес. Убедитесь, что вы используете IP-адрес wifi (обычно 192.168.0.0/16).

  2. Добавить статический маршрут для маршрутизации трафика вашего приложения на Wi-Fi. Не уверен, возможно ли это на не укоренившемся андроиде.

  3. Получите статический адрес IPv4 у вашего оператора сотовой связи. IPv4s мало, и большинство устройств скрыты за NAT/PAT, что делает невозможным прямые связи между ними. По крайней мере одна сторона нуждается в глобальном статическом IP-адресе, известном другой стороне.

  4. Получите IPv6-адрес у вашего оператора сотовой связи.

Также обратите внимание, что 3 и 4 части Wi-Fi эффективно не используются.

+0

Просматривал это какое-то время, вы спасли меня! Спасибо ! –

Смежные вопросы