Android的HttpURLConnection类HttpPost收到SocketException:没有到主机的路由 [英] Android HttpUrlConnection HttpPost receive a SocketException: no route to host

查看:732
本文介绍了Android的HttpURLConnection类HttpPost收到SocketException:没有到主机的路由的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,我尝试将HttpPost通过WiFi发送到一个特殊的设备在本地网络。如果我尝试在一个简单的Java应用程序,将工作在同一code,但如果我尝试在Android上同样code我不能送HttpPost。

 字符串的uri =htt​​p://192.168.3.201:8080/remote/json-rpc/getPeripherals;
Log.i(URI,URI);
字符串requestBody ={\\jsonrpc \\:\\2.0 \\,\\方法\\:
    +\\configclient_homedevices / getPeripherals \\,\\ID \\:
    +\\1349942076918 \\,\\PARAMS \\:[]};
Log.i(URI,URI);
字符串的contentType =应用/ JSON;
字符串的userPassword =富:富;
字符串连接code = Base64.en codeToString(userpassword.getBytes()
    Base64.URL_SAFE | Base64.DEFAULT);
尝试{
    网址URL = NULL;
    URL =新的URL(URI);
    连接=(HttpURLConnection类)url.openConnection(Proxy.NO_PROXY);
    connection.setDoOutput(真);
    connection.setRequestMethod(POST);
    connection.setRequestProperty(授权,基本+ EN code);
    connection.setRequestProperty(内容类型的contentType);
    connection.setRequestProperty(接受,应用/ JSON);
    connection.setRequestProperty(内容长度,
        + Integer.toString(requestBody.getBytes()的长度。));
    connection.setUseCaches(真);
    connection.setDoInput(真);
    DataOutputStream类出= NULL;
    OUT =新DataOutputStream类(connection.getOutputStream());
    out.write(requestBody.getBytes());
    了out.flush();
    out.close();
}赶上(IOException异常IOE){
    connection.disconnect();
    ioE.printStackTrace();
}
// connection.connect();
尝试{
    如果(connection.getResponse code()== HttpURLConnection.HTTP_OK){
        Log.i(状态,的toString()的valueOf(connection.getResponse code()));
        InputStream为= connection.getInputStream();
        RD的BufferedReader =新的BufferedReader(新的InputStreamReader(是));
        串线;
        StringBuffer的响应=新的StringBuffer();
        而((行= rd.readLine())!= NULL){
            response.append(线);
            response.append('\\ r');
        }
        rd.close();
        this.response = response.toString();
        Log.i(回应,response.toString());
    }其他{
        Log.i(状态,的toString()的valueOf(connection.getResponse code()));
        Log.i(状态消息,connection.getResponseMessage());
        connection.disconnect();
    }
}赶上(IOException异常五){
    e.printStackTrace();
}

这个功能是从AsyncTask的扩展子类。在清单中我启用了Permission.INTERNET

 <使用许可权的android:NAME =android.permission.INTERNET对/>

的结果是:

  14 10-23:52:51.590:W / System.err的(5983):java.net.SocketException异常:没有到主机的路由
10-23 14:52:51.590:W / System.err的(5983):在org.apache.harmony.luni.platform.OSNetworkSystem.connect(本机方法)
10-23 14:52:51.590:W / System.err的(5983):在dalvik.system.BlockGuard $ WrappedNetworkSystem.connect(BlockGuard.java:369)
10-23 14:52:51.590:W / System.err的(5983):在org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
10-23 14:52:51.590:W / System.err的(5983):在org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
10-23 14:52:51.590:W / System.err的(5983):在java.net.Socket.connect(Socket.java:901)
10-23 14:52:51.590:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-23 14:52:51.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-23 14:52:51.600:W / System.err的(5983):在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):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-23 14:52:51.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
10-23 14:52:51.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:250)
10-23 14:52:51.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:217)
10-23 14:52:51.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:624)
10-23 14:52:51.600:W / System.err的(5983):在com.febro.myfoo.fooLoginActivitiy $ MakeConnection.doInBackground(fooLoginActivitiy.java:339)
10-23 14:52:51.610:W / System.err的(5983):在com.febro.myfoo.fooLoginActivitiy $ MakeConnection.doInBackground(fooLoginActivitiy.java:1)
10-23 14:52:51.610:W / System.err的(5983):在android.os.AsyncTask $ 2.call(AsyncTask.java:252)
10-23 14:52:51.610:W / System.err的(5983):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
10-23 14:52:51.610:W / System.err的(5983):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 14:52:51.610:W / System.err的(5983):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
10-23 14:52:51.610:W / System.err的(5983):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:574)
10-23 14:52:51.610:W / System.err的(5983):在java.lang.Thread.run(Thread.java:1020)
10-23 14:52:54.600:W / System.err的(5983):java.net.SocketException异常:没有到主机的路由
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.platform.OSNetworkSystem.connect(本机方法)
10-23 14:52:54.600:W / System.err的(5983):在dalvik.system.BlockGuard $ WrappedNetworkSystem.connect(BlockGuard.java:369)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
10-23 14:52:54.600:W / System.err的(5983):在java.net.Socket.connect(Socket.java:901)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-23 14:52:54.600:W / System.err的(5983):在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):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038)
10-23 14:52:54.600:W / System.err的(5983):在org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponse$c$c(HttpURLConnectionImpl.java:736)
10-23 14:52:54.600:W / System.err的(5983):在com.febro.myfoo.fooLoginActivitiy $ MakeConnection.doInBackground(fooLoginActivitiy.java:351)
10-23 14:52:54.600:W / System.err的(5983):在com.febro.myfoo.fooLoginActivitiy $ MakeConnection.doInBackground(fooLoginActivitiy.java:1)
10-23 14:52:54.600:W / System.err的(5983):在android.os.AsyncTask $ 2.call(AsyncTask.java:252)
10-23 14:52:54.600:W / System.err的(5983):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
10-23 14:52:54.610:W / System.err的(5983):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 14:52:54.610:W / System.err的(5983):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
10-23 14:52:54.610:W / System.err的(5983):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:574)
10-23 14:52:54.610:W / System.err的(5983):在java.lang.Thread.run(Thread.java:1020)

唯一的例外是在

抛出

  OUT =新的DataOutputStream类(connection.getOutputStream());


解决方案

我发现我的问题的解决方案。这个问题是改变这个我收到了状态code 400错误的请求之后的固定的IP地址在URL中。这个问题我之前我得到了切换请求到异步任务的子类。对于错误的请求我在Wireshark的协议找到了解决办法。客户端发送2超文本传输​​协议在一个HTTP POST。这造成的 android.Base64.en code()梅索德。密码字符串:带连接codeR A / N编码后用户插入。在这种情况下,客户端发送的HTTP,只有基本身份验证和第二,其余身体没有基本身份验证。因此服务器无法读取请求。

要改变这一点,你应该写的 android.Base64.en code(NO_WARP)此标志将连接code中的用户名:密码正确

Hey I try to send a HttpPost to an special Device in a local network over wifi. If I try the same code on a simple Java application it will work, but If I try the same code on android I am not able to send the 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();
}

this function is in a subclass which extends from AsyncTask. In the Manifest I enabled the Permission.INTERNET

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

The result is:

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)

The Exception is thrown at

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

解决方案

I found a solution for my Issue. The Issue was a fixed IP adress in the url after changing this I received a Status Code 400 Bad Request. This issue I got before I switched the request to a async task subclass. The solution for the Bad Request I found in the wireshark protocol. The Client send 2 Hypertext transfer protocols in one http Post. This caused by the android.Base64.encode() methode. The encoder inserted a /n after encoding the user:password string. In this case the client sent one http with only basic auth and a second with the rest the body without the basic auth. So the server could not read the request.

To change this you should write android.Base64.encode(NO_WARP) this Flag will encode the username:password right.

这篇关于Android的HttpURLConnection类HttpPost收到SocketException:没有到主机的路由的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆