#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 не позволит это сделать.
Комментариев нет:
Отправить комментарий