Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило - QubStore

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

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

Немного о себе — Senior Java Developer, работаю на удаленке и постоянно мигрирую между деревней и городом (эта часть будет важна позже). В свободное время под настроение бывает пишу простенькие программки или игры в надежде что что‑то из этого однажды выстрелит и я проснусь богатым человеком, которому больше не придется никогда работать.

Теперь к сути — на работе дали мне проект по переписи китайского реакт монолита на наш спринговый с thymeleaf. Таймлиф выб выбран для простоты, и оттого что в проекте только одна страница (а нам не нужен отдельный микросервис фронта на одну страницу). Вот только эта единственная страница должна распознавать руку и работать не только с пк, но и с телефонов.

На пк то всё понятно, для проверки достаточно перейти на localhost:8080 и проверяй что хочешь. Но вот для телефона не всё так просто. Вернее просто, но муторно.

Покажу пошагово как это делаю я на примере одного из своих пет проектов.

1) Сперва запускаем свой сервис, который хотим открыть на телефоне.

Не важно что это за сервис. В моем случае это SpringBoot приложение, но это также может быть React, TypeScript, NestJS или любая нейронка с интерфейсом. Главное что есть фронт куда надо зайти с телефона, и сервис запущен локально.

Любой запущенный сервис

2) Подключаем машину (компьютер/ноутбук) к одной сети

Чтоб с телефона зайти на наш локальный сервис, он должен находиться с ним в одной сети, проще говоря подключиться к тому же wifi.

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

3) Открываем консоль и ищем локальный IP

Лёгкая часть, после которой начнется муть. Консоль открыть можно разными путями: в адресе проводника написать cmd, через win+r и туда написать — cmd, или просто через пуск найти командную строку. После её открытия пишем единственную команду — ipconfig. После её ввода консоль отобразит все наши ip адреса

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

IP адреса с ноутбука

Повезло что при проверке с деревни (где я сейчас) их отобразилось совсем мало. В городе, где используется один модем для связи, а второй усилитель первого — адресов в два раза больше.

4) Начинаем перебор на телефоне

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

192.168.56.1:8080

192.168.1.6:8080

Пробуем первый — мимо. Пробуем второй — ура, заработал!

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

Перебор IP адресов на мобильном

Поздравляю, теперь вы умеете заходить на локально запущенные сервисы с телефона!

…

Эх, если бы всё было так просто.

Для разового захода инструкция более чем подходящая, но я не просто так написал что способ меня выбесил. У моего роутера динамический ip, это значит что при каждом новом подключении я получу другой ip, и по прошлому уже не зайду, так что разово запоминать его для меня бессмысленно. А ещё у меня отдельно рабочий и личный ноутбук, так что в том проекте, что мне дали на работе, я должен использовать уже другой ip адрес, заново проходя все шаги для его получения.

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

Постоянная смена IP

Неделя в деревне прошла, поехал в город — и давай по новой искать адреса и для работа, и для пет проекта. И так каждую неделю, раз за разом, повторяя это безумие в надежде что что‑то изменится. Нет, не изменилось.

Хватит это терпеть! Сказал я себе и решил упростить себе жизнь. Что я сделал? Мобильное приложение, которое само по указанному порту ищет в сети адрес и открывает мне страницу. Т.е. теперь, вместо повторения всей этой муторни мне достаточно ввести на телефоне порт, нажать кнопку поиска и всё, адрес сам будет найден и открыт в браузере!

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

Как это работает под капотом:

1) Приложение узнаёт, в какой локальной сети находится телефон.

Например, телефон получил от роутера адрес 192.168.1.7. Из этого уже можно понять, что остальные устройства дома, скорее всего, находятся где‑то рядом: 192.168.1.1, 192.168.1.2, 192.168.1.3 и так далее.

2) Далее вводим нужный порт. Допустим, Spring Boot приложение запущено на 8080. Значит, искать нужно не просто компьютер, а устройство, которое отвечает именно на порту 8080.

3) Приложение перебирает возможные адреса в локальной сети. Но не последовательно, ожидая каждый адрес по несколько секунд (иначе поиск занял бы вечность). Проверки запускаются параллельно с небольшими таймаутами:

192.168.1.1:8080

192.168.1.2:8080

192.168.1.3:8080

…

192.168.1.254:8080

Большинство адресов сразу отваливаются: на них либо вообще нет устройства, либо нужный порт закрыт.

Почему перебор: телефон не знает, какой именно компьютер в сети принадлежит мне и на каком из устройств запущен мой Spring Boot. Роутер не сообщает приложению: «вот это ноутбук автора, а вот здесь у него backend». Поэтому задача сводится к небольшому локальному сканированию: найти устройство, которое действительно отвечает на нужном порту.

4) Если порт открыт — нужно понять, что на нём находится. Сам факт открытого TCP‑порта ещё не означает, что там сайт. Поэтому приложение пробует обратиться к адресу по HTTP и HTTPS. Например: http://192.168.1.5:8080/ или: https://192.168.1.5:8080/

Если сервер отдаёт нормальный HTTP‑ответ — значит, цель найдена.

5) HTTPS тоже проверяется. Для меня это было особенно важно, потому что локальные приложения я иногда запускаю с самоподписанным сертификатом. Обычная проверка такого сертификата закономерно скажет: «сертификату доверять нельзя». Но для задачи поиска это не имеет большого значения: мне нужно сначала понять, что на этом IP и порту вообще живёт HTTPS‑сервер. Поэтому во время самого поиска приложение умеет определить такой сервер даже с self‑signed сертификатом.

6) Найденный адрес показывается пользователю. После этого, пока IP компьютера не изменился, приложение можно вообще не сканировать.

И теперь моя жизнь превратилась в сказку! (ну почти).

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

Легко ли было это сделать? На удивление да, хватило одного вечера. Можно ли самому написать такое приложение? Вообще без проблем, киньте в нейронку описание и она выдаст готовое решение (ну или частично готовое). Или напишите руками, освежив свои знания.

И всё же я не единственный в мире человек, которому приходится открывать на телефоне что‑либо запущенное локально, так что вполне вероятно что это бесит кого‑то ещё. Поэтому ради тех кому лень самому писать такую же тулу, пройдя свозь трудности модерации и тестирования от гугла, я опубликовал приложение в Google play market, называется Localhost Finder. Оно бесплатно и без рекламы, так что если испытываете ту же боль что и я, то при желании можете скачать и потыкать, может и вам оно поможет.

Вероятно есть куда более быстрые и правильные способы поиска IP и перехода в мобильном, но я как‑то привык использовать ipconfig ещё с детства, когда искали порты для подключения по локальной сети в КС. Так что если кто‑то знает что можно было сделать по другому — добро пожаловать в комментарии, будет интересно почитать. Учиться никогда не поздно

Как легко открыть запущенный локально сервис на телефоне и почему меня это выбесило

Евгений

Senior Java Dev

Ссылка на основную публикацию