Android HttpUrlConnection HttpPost接收到SocketException:没有到主机的路由
嘿,我尝试通过wifi向本地网络中的特殊设备发送HttpPost。如果我在一个简单的Java应用程序上尝试相同的代码,它会工作,但是如果我在android上尝试相同的代码,我就无法发送HttpPostAndroid HttpUrlConnection HttpPost接收到SocketException:没有到主机的路由,android,http-post,httpurlconnection,socketexception,Android,Http Post,Httpurlconnection,Socketexception,嘿,我尝试通过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\":"
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" />
当您通过不同于PC的网络连接手机时,可能会发生这种情况。不同的网络可能有不同的防火墙规则 PC通常通过内部网络(通常为以太网)连接。而移动电话通常通过WIFI连接,具有更强的防火墙规则
顺便说一句,错误是:
java.net.SocketException:No route to host
这与GET vs.POST无关。HTTP GET或POST将在客户端能够连接之后传输到服务器。当您通过不同于PC的网络连接手机时,可能会发生这种情况。不同的网络可能具有不同的防火墙规则
PC通常通过内部网络(通常为以太网)连接。而移动电话通常通过WIFI连接,具有更强的防火墙规则
顺便说一句,错误是:
java.net.SocketException:No route to host
这与GET vs.POST无关。HTTP GET或POST将在客户端能够连接后通信到服务器。我找到了解决问题的方法。问题是url中有一个固定IP地址,更改此地址后,我收到一个状态代码400的错误请求。在将请求切换到异步任务子类之前,我遇到了这个问题。我在wireshark协议中找到的错误请求的解决方案。客户端在一个http Post中发送两个超文本传输协议。这是由android.Base64.encode()方法引起的。编码器在编码用户:密码字符串后插入了a/n。在这种情况下,客户端发送一个http,其中只有基本身份验证,而发送第二个http,其余的则发送正文,而没有基本身份验证。因此服务器无法读取请求
要更改此设置,您应该编写android.Base64.encode(无扭曲)此标志将对用户名进行编码:正确的密码。我找到了解决问题的方法。问题是url中有一个固定IP地址,更改此地址后,我收到一个状态代码400的错误请求。在将请求切换到异步任务子类之前,我遇到了这个问题。我在wireshark协议中找到的错误请求的解决方案。客户端在一个http Post中发送两个超文本传输协议。这是由android.Base64.encode()方法引起的。编码器在编码用户:密码字符串后插入了a/n。在这种情况下,客户端发送一个http,其中只有基本身份验证,而发送第二个http,其余的则发送正文,而没有基本身份验证。因此服务器无法读取请求
要改变这一点,您应该编写android.Base64.encode(无扭曲)此标志将对用户名进行编码:正确的密码。您似乎没有连接到Internet。您可以从测试设备上运行的web浏览器连接到目标URL吗?是的,我可以通过本地wifi通过浏览器连接到设备。我可以调用url,但不能调用post请求,因为我无法通过浏览器将post消息放入请求中。但这应该是正常的。如果我在笔记本上的java应用程序上尝试,我会得到一个结果。顺便说一句,我切换了目标系统,这是同一个问题。我很好奇为什么你要实例化
DataOutputStream
,如果你删除那一行,它能工作吗?注释掉这一行DataOutputStream out=null代码>。文档:“不能直接实例化DataOutputStream,而必须通过静态方法创建实例createDataOutputStream(OutputStream out,int-endianess)
”我使用的是java.io库,没有名为createDataOutputStream的方法。你真的认为这是一个问题吗?看起来你只是没有连接到Internet。你可以从测试设备上运行的web浏览器连接到目标URL吗?是的,我可以通过本地wifi通过浏览器连接到设备。我可以调用url,但不能调用post请求,因为我无法通过浏览器将post消息放入请求中。但这应该是正常的。如果我在笔记本上的java应用程序上尝试,我会得到一个结果。顺便说一句,我切换了目标系统,这是同一个问题。我很好奇为什么你要实例化DataOutputStream
,如果你删除那一行,它能工作吗?注释掉这一行DataOutputStream out=null代码>。文档:“不能直接实例化DataOutputStream,而必须通过静态方法创建实例createDataOutputStream(OutputStream out,int-endianess)
”我使用的是java.io库,没有名为createDataOutputStream的方法。你真的认为这是个问题吗?不,我不认为这是解决这个问题的办法。我也在笔记本上使用wifi。不,我不认为这是解决这个问题的方法。我也在笔记本上使用wifi。
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());