2013-08-31 2 views
1

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

Я запускаю объект сервера в отдельной 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 вместо этого? извините, если это вопрос noob.

Когда я подключаюсь к моему эмулятора с помощью 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(); 
    } 

ответ

1

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

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

+0

Я просто попытался «127.0.0.1» и до сих пор жду соединений, есть путь от ADB оболочки, чтобы сделать такие вещи, как телнет? Btw У меня есть все виды разрешений, такие как INTERNET и ACCESS_NETWORK_STATE с учетом –

0

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

new Thread(new Runnable() { 

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

это работает !!

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

Его также стоит отметить, что на сторону клиента, соединение также должен быть обернут внутри AsyncTask

+1

'AsyncTask' использует пул потоков (и в некоторых версиях Android только одна задача может выполняться одновременно, если вы не указали иначе). Поэтому неплохо иметь бесконечный цикл в «AsyncTask», поскольку он блокирует один из потоков в пуле. – Henry