簡體   English   中英

無法在Android上獲得HTTP服務器的工作

[英]Cannot get http server work on 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 shell連接到仿真器並運行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();
    }

對於服務器,地址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中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM