1

私は 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();
    }
4

2 に答える 2

1

サーバーの場合、アドレス 0.0.0.0 はワイルドカードのようなもので、デバイスが持つすべての IP アドレスをリッスンしていることを意味します。

クライアントには、127.0.0.1 のような実際の IP アドレスを使用する必要があります。

于 2013-08-31T06:19:54.017 に答える
0

少しデバッグした後、クライアントが接続を開く場所ではなく、サーバーが起動する場所に問題があることがわかりましたが、onPostExecute()メソッドが返されませんでしたが、サーバーの起動コードを Runnable 内にラップした後

  new Thread(new Runnable() {

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

できます!!

サーバーは無限ループなので、スレッド内から起動する必要がありますか? AsyncTask がそれを処理できると思いましたか?

クライアント側の接続も AsyncTask 内にラップする必要があることにも言及する価値があります

于 2013-08-31T07:06:16.450 に答える