Не удается заставить http-сервер работать на Android

У меня есть http-код сервера (я пробовал оба TJWS или NanoHTTPD), клиент из того же приложения будет подключаться к серверу, работающему через порт 8080 или что-то еще.

Я запускаю объект сервера в отдельном AsyncTask, так что все должно быть в порядке.

Хотя NanoHTTPD полностью не удалось запустить другие способы, которые я вижу из журналов TJWS, он говорит что-то вроде:

server listening on 0.0.0.0/0.0.0.0 port:0 localport:8080

Это означает, что сервер успешно запущен, первый вопрос: 0.0.0.0 адрес привязки приемлем? Я имею в виду это должно быть 127.0.0.1 вместо этого? извините, если это нубский вопрос.

Когда я подключаюсь к своему эмулятору с помощью оболочки adb и запускаю netstat, я вижу следующие строки

Proto Recv-Q Send-Q Local Address          Foreign Address        State
 tcp       0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
 tcp       0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
 tcp       0      0 10.0.2.15:5555         10.0.2.2:52132         ESTABLISHED
tcp6       0      0 :::8080                :::*                   LISTEN

Погуглив, я узнал, что 0:::8080 означает, что сервер прослушивает ipv6 и ipv4, и это нормально.

Но из моего клиентского кода, когда я пытался получить доступ к нему, продолжает ждать вечность.

мой httpClient код

   try {
        URL url = new URL("http://0.0.0.0:"+8080+"/media");
        URLConnection conn = url.openConnection();
        InputStream is = conn.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String line;
        while((line = br.readLine()) != null){
            Log.d("server", line);
        }
    } catch (MalformedURLException e) {

        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

2 ответа

Для сервера адрес 0.0.0.0 подобен групповому символу и означает, что он прослушивает все IP-адреса, которые имеет устройство.

Для клиента вам нужно использовать реальный IP-адрес, такой как 127.0.0.1

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

  new Thread(new Runnable() {

        @Override
        public void run() {
            Log.d("server", "server starting on port: " + port);
            srv.serve();
        }
    }).start();  

оно работает!!

Сервер представляет собой бесконечный цикл, поэтому его нужно запускать изнутри потока? Я думал, что AsyncTask может справиться с этим?

Также стоит упомянуть, что соединение на стороне клиента также должно быть заключено в AsyncTask

Другие вопросы по тегам