Не удается заставить 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