无法在Android上获得http服务器

时间:2013-08-31 06:07:54

标签: android http nanohttpd tjws

我有一个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();
    }

2 个答案:

答案 0 :(得分:1)

对于服务器,地址0.0.0.0就像一个通配符,意味着它正在监听设备所拥有的所有IP地址。

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

答案 1 :(得分:0)

稍微调试后我发现问题不是客户端打开连接的问题,但问题出在服务器启动的地方它从未返回 onPostExecute()方法,但是将我的服务器启动代码包装在一个Runnable

  new Thread(new Runnable() {

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

服务器是一个无限循环所以它必须从内部线程启动?我以为AsyncTask可以解决这个问题吗?

还值得一提的是客户端连接也必须包含在AsyncTask中