【问题标题】:Android HttpUrlConnection HttpPost receive a SocketException: no route to hostAndroid HttpUrlConnection HttpPost 收到 SocketException: no route to host
【发布时间】:2012-10-23 13:09:15
【问题描述】:

嘿,我尝试通过 wifi 将 HttpPost 发送到本地网络中的特殊设备。如果我在一个简单的 Java 应用程序上尝试相同的代码,它将起作用,但如果我在 android 上尝试相同的代码,我将无法发送 HttpPost。

String uri = "http://192.168.3.201:8080/remote/json-rpc/getPeripherals";
Log.i("uri", uri);
String requestBody = "{\"jsonrpc\":\"2.0\",\"method\":"
    + "\"configclient_homedevices/getPeripherals\",\"id\":"
    + "\"1349942076918\",\"params\":[]}";
Log.i("uri", uri);
String contentType = "application/json";
String userpassword = "foo:foo";
String encode = Base64.encodeToString(userpassword.getBytes(),
    Base64.URL_SAFE | Base64.DEFAULT);
try {
    URL url = null;
    url = new URL(uri);
    connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
    connection.setDoOutput(true);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Authorization", "Basic" + encode);
    connection.setRequestProperty("Content-Type", contentType);
    connection.setRequestProperty("Accept", "application/json");
    connection.setRequestProperty("Content-Length",
        "" + Integer.toString(requestBody.getBytes().length));
    connection.setUseCaches(true);
    connection.setDoInput(true);
    DataOutputStream out = null;
    out = new DataOutputStream(connection.getOutputStream());
    out.write(requestBody.getBytes());
    out.flush();
    out.close();
} catch (IOException ioE) {
    connection.disconnect();
    ioE.printStackTrace();
}
// connection.connect();
try {
    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        Log.i("Status", toString().valueOf(connection.getResponseCode()));
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();
        while ((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
        }
        rd.close();
        this.response = response.toString();
        Log.i("Response", response.toString());
    } else {
        Log.i("Status", toString().valueOf(connection.getResponseCode()));
        Log.i("Status-message", connection.getResponseMessage());
        connection.disconnect();
    }
} catch (IOException e) {
    e.printStackTrace();
}

此函数位于从 AsyncTask 扩展的子类中。在清单中我启用了 Permission.INTERNET

<uses-permission android:name="android.permission.INTERNET" />

结果是:

10-23 14:52:51.590: W/System.err(5983): java.net.SocketException: No route to host
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
10-23 14:52:51.590: W/System.err(5983):     at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:369)
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
10-23 14:52:51.590: W/System.err(5983):     at java.net.Socket.connect(Socket.java:901)
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:250)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:217)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:624)
10-23 14:52:51.600: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:339)
10-23 14:52:51.610: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:1)
10-23 14:52:51.610: W/System.err(5983):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
10-23 14:52:51.610: W/System.err(5983):     at java.lang.Thread.run(Thread.java:1020)
10-23 14:52:54.600: W/System.err(5983): java.net.SocketException: No route to host
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
10-23 14:52:54.600: W/System.err(5983):     at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:369)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
10-23 14:52:54.600: W/System.err(5983):     at java.net.Socket.connect(Socket.java:901)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:736)
10-23 14:52:54.600: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:351)
10-23 14:52:54.600: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:1)
10-23 14:52:54.600: W/System.err(5983):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
10-23 14:52:54.600: W/System.err(5983):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-23 14:52:54.610: W/System.err(5983):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 14:52:54.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
10-23 14:52:54.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
10-23 14:52:54.610: W/System.err(5983):     at java.lang.Thread.run(Thread.java:1020)

异常被抛出

out = new DataOutputStream(connection.getOutputStream());

【问题讨论】:

  • 好像你只是没有连接到互联网
  • 你能从测试设备上运行的网络浏览器连接到目标 URL 吗?
  • 是的,我可以通过本地 wifi 通过浏览器连接到设备。我可以调用 url 但不能调用 post-request,因为我无法通过浏览器将 POST-Message 放入请求中。但这应该是正常的。如果我在笔记本上的 java 应用程序上尝试它,我会得到一个结果。顺便说一句,我切换了目标系统,这是同样的问题。
  • 我很好奇你为什么要实例化DataOutputStream,如果你删除那行,它会起作用吗?注释掉这一行DataOutputStream out = null;。文档:“不能直接实例化DataOutputStream,必须通过静态方法createDataOutputStream(OutputStream out, int endianess)创建实例”
  • 我正在使用 java.io 库,并且没有名为 createDataOutputStream 的方法。你真的认为这是个问题吗?

标签: android http-post httpurlconnection socketexception


【解决方案1】:

当您通过与 PC 不同的网络连接手机时,可能会发生这种情况。不同的网络可以有不同的防火墙规则。

PC 通常通过内部网络(通常是以太网)连接。而手机一般都是通过WIFI连接,防火墙规则比较强。

顺便说一句,错误是:java.net.SocketException: No route to host 这与 GET 与 POST 无关。 HTTP GET 或 POST 稍后在客户端能够连接后与服务器通信。

【讨论】:

  • 不,我不认为这是解决此问题的方法。我也在笔记本上使用wifi。
【解决方案2】:

我为我的问题找到了解决方案。问题是 URL 中的 固定 IP 地址 更改后我收到了 状态代码 400 错误请求。我在将请求切换到异步任务子类之前遇到了这个问题。我在wireshark协议中找到的Bad Request的解决方案。客户端在一个 http Post 中发送 2 个超文本传输​​协议。这是由 android.Base64.encode() 方法引起的。编码器在对 user:password 字符串进行编码后插入了 /n。在这种情况下,客户端发送了一个只有基本身份验证的 http,第二个是没有基本身份验证的正文。所以服务器无法读取请求。

要改变这一点,你应该写 android.Base64.encode(NO_WARP) 这个标志将对用户名:密码正确编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 2020-03-23
    • 2013-08-21
    • 1970-01-01
    • 2013-05-11
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多