Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Невозможно подключиться к серверу с другого IP

#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, Map headers, 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 не позволит это сделать.

Комментариев нет:

Отправить комментарий