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 地址。

对于客户端,您需要使用真实 IP 地址,例如 127.0.0.1

于 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 回答