Q:

Статический/динамический IP, UDP Java, туннели, Datagram

У меня есть проблема большая: я делаю соединение Android и компьютера через UDP (Java/Android - клиентская часть, Java в IntelliJIdea - серверная - понятно что это условно говоря, они просто выполняют такие роли). Мне нужно просто чтобы, к примеру, с Андроида на компьютер пришло сообщение, или просто передались какие-то данные, но у меня телефон как-то должен увидеть сервер на компьютере. При чем совсем не обязательно, чтобы эти два устройства находились в одной локальной сети. То есть тут нужен внешний IP или что-то в этом роде
Я пробовал так: пробрасываю порт на роутере, к примеру, 1110 (при этом указываю там IP своего компьютера) и на сервере делаю порт 1110, а в клиенте при создании DatagramPacket (для его отправки на сервер) я указываю InetAddress.getByName("46.98.191.197"); в скобках - внешний адрес моего роутера и тот же порт - 1110.
Но не вышло - если я в телефоне подключен в роутеру, к которому подключен сервер - то работает, а если я в телефоне включил 3G мобильный - то уже нет, не может найти сервер.
Как быть? Может кто-то туннель знает, типа ngrok'а или какой-то еще способ есть? Потому что нужно использовать именно UDP, TCP сокетами простыми не подходит для задачи.

A:

Для того, чтобы подключиться к любому серверу, Вам нужен его айпи-адрес и порт для подключения.В этом, по сути, и состоит смысл сервера - любой сервер ожидает подключения на определенном порту. Айпи служит для того, чтобы найти компьютер в сети , а порт - просто условное число, это своего рода идентификатор, чтобы понять, какой программой обрабатывать запрос, пришедший на сервер. Если Вы пытаетесь подключиться через интернет, то Вы должны понимать , что такое динамический айпи. По сути, это значит, что ваш провайдер периодический меняет ваш айпи-адрес. Для вас, как пользователя, это не критично. Потому как в этом случае запросы на сервер идут от Вас, а уже потом на Ваш запрос приходит ответ от сервера.В этом смысл HTTP-сессии. Есть запрос - Request и ответ - Response. Потом сессия закрывается. Посему айпи клиента значения не имеет. Сервер - другое дело. Изменение его айпи делает невозможным подключение к нему просто потому, что его невозможно найти в сети. Кроме того, скорее всего у вас стоит роутер. Все, что подключено к роутеру, имеет внутренний айпи и его присваивает роутер. Внешний айпи, который дал вам провайдер, знает только ваш роутер. В этом случае вам нужно конфигурировать роутер, чтобы при обращении на определенный порт он перенаправлял запрос на определенный внутренний айпи, который, разумеется, вы на своем компьютере, выполняющем роль сервера, должны тоже сделать статическим. Нужно учесть, что любые антивирусные и им подобные программы могут блокировать доступ через порты, потому как это потенциальная уязвимость. Плюс тоже самое может делать роутер. Ну и в конце эпопеи, учитывая , что ваш айпи с вероятность 99 процентов динамический, вам еще придется договориться с провайдером о статическом айпи либо обуздать такую штуку, как днс-сервер. В последнем случае на вашем компьютере, выполняющем роль сервера, запускается утилита, которая периодически обращается к днс-серверу, который определяет ваш динамический айпи, а днс-сервер уже переадресовывает на него всех клиентов.Таким образом, между клиентов и сервером есть посредник - днс-сервер. В качестве такого сайта могу посоветовать http://hldns.ru/, один из немногих, который до сих пор бесплатный, хотя и не очень быстрый... Там же можно прочитать подробнее про днс и пр. Задача нетривиальная, так что удачи.

