#java #android #сервер
Привет! Собрал небольшой "сервер" на Android, используя NanoHTTPD. Код активити: mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); int ipAddress = mWifiManager.getConnectionInfo().getIpAddress(); SERVER_IP = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff)); try { mServer = new MyServer(SERVER_IP, SERVER_PORT); mServer.start(); log("Server started! Please visit:"); log("http://" + SERVER_IP + ":" + SERVER_PORT); } catch (Exception ex) { log("Shit! Can't start server!"); for (StackTraceElement ste : ex.getStackTrace()) { log(ste.toString()); } } Код сервера: public class MyServer extends NanoHTTPD { public MyServer(String address, int port) { super(address, port); } @Override public NanoHTTPD.Response serve(String uri, NanoHTTPD.Method method, Mapheaders, Map parms, Map files) { MainActivity.log("Incoming " + method.toString() + " request!"); String html = " Hello, World
"; return newFixedLengthResponse(html); } } После запуска приложения в логах появляется надпись: Server started! Please visit: http://192.168.1.3:1450 С другого устройства в той же WiFi сети захожу на страницу, показывается Hello, world!, а на "сервере" в логах Incoming GET request! Но как только я переключаю на "клиенте" WiFi сеть и пытаюсь сделать запрос на "сервер" http://мой.внешний.статический.ip:1450, то во всех браузерах мгновенно выводится ошибка ECONNREFUSED (Connection Refused). В домашней сети я открыл порты 1400-1500 для "сервера" и сделал перенаправление с порта 80 на порт 1450 (чтобы можно было не вводить порт). NAT и прочие провайдерские ограничения отсутствуют. Как можно исправить эту ошибку?
Ответы
Ответ 1
Если вы сделали перенаправление с 80 на 1450, то укажите роутеру на какой IP перенаправлять. И заходите http://мой.внешний.статический.ip:80 тогда. Порты 1400-1500 можете закрыть, раз у Вас перенаправление. И убедитесь, что 80 порт открыт для входящих соединений.Ответ 2
В общем, это заняло у меня много времени, но я всё же добился своего. По совету @Eugene Krivenja я закрыл порты 1400-1500, ещё раз проверил перенаправление с 80 на 1450 - всё верно. Пытался после этого зайти на сервер - ошибка ECONNREFUSED всё равно возникала, но уже не сразу, а через 20-30 секунд. Ну, я тогда начал действовать кардинально: немного изменил код сервера, очистил и пересобрал проект (на всякий случай, лишний раз не помешает); обновил прошивку роутера и снова сделал перенаправление с порта 80 на 1450 для конкретного IP. Скрин настроек роутера после действий над ним: Затем я запустил приложение-сервер и попытался зайти на него с клиента. Что, собственно, прошло успешно: Ну и на "сервере" появились соответствующие сообщения: Итог. Мне так и не удалось выяснить, что же стало причиной недоступности сервера, однако у меня есть 2 подозрения: Проблема с прошивкой на роутере Мои кривые руки и невозможность для меня сделать всё правильно с первого раза. ...но всё же, после моих радикальных действий сервер запустился и я этому очень рад. P.S. Если возникнет вопрос, мол "Далеко ли ты уйдёшь на 480 Мб оперативки", то отвечу сразу - мне просто было интересно сделать свой "сервер" на Android, кроме как "Hello world" применения я ему не знаю. P.P.S Небольшая заметка для тех, кто тоже захочет так поэкспериментировать: не выбирайте для своего сервера порт меньше 1024 - Android не позволит это сделать.
Комментариев нет:
Отправить комментарий