Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C2DM中的HTTP Post提供SocketTimeoutException_Java_Android_Servlets - Fatal编程技术网

Java C2DM中的HTTP Post提供SocketTimeoutException

Java C2DM中的HTTP Post提供SocketTimeoutException,java,android,servlets,Java,Android,Servlets,我制作了一个应用程序。对于使用谷歌C2DM服务的Android。我 根据一些教程制作了一个服务器模拟器,效果很好。我的 问题是,我试图构建一个Javaservlet。从Android设备 它会很好地接收消息并保存注册ID,但当我 尝试向Google C2DM服务器发送https POST请求,但它总是这样 获取SocketTimeoutException:获取时超时: . 我不明白为什么在Android上也会发生同样的事情 装置。代码如下: //The AuthToken from Google

我制作了一个应用程序。对于使用谷歌C2DM服务的Android。我 根据一些教程制作了一个服务器模拟器,效果很好。我的 问题是,我试图构建一个Javaservlet。从Android设备 它会很好地接收消息并保存注册ID,但当我 尝试向Google C2DM服务器发送https POST请求,但它总是这样 获取SocketTimeoutException:获取时超时: . 我不明白为什么在Android上也会发生同样的事情 装置。代码如下:

//The AuthToken from Google Client Login

 String auth_key = TOKEN;    
 StringBuilder postDataBuilder = new StringBuilder();

 //some parameters to pass, I've checked and it's correct, it's working
 //with Fiddler
 postDataBuilder.append(PARAM_REGISTRATION_ID).append("=").append(REGISTRATION_ID);
 postDataBuilder.append("&").append(PARAM_COLLAPSE_KEY).append("=").append("0");
 postDataBuilder.append("&").append("data.payload").append("=").append(URLEncoder.encode(message, UTF8));

 byte[] postData = postDataBuilder.toString().getBytes(UTF8);
 URL url = new URL("https://android.clients.google.com/c2dm/send");

 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setDoOutput(true);
 conn.setUseCaches(false);

 conn.setRequestMethod("POST");
 conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");

conn.setRequestProperty("Content-Length",Integer.toString(postData.length));
 conn.setRequestProperty("Authorization", "GoogleLogin auth="+auth_key);

 OutputStream out = conn.getOutputStream();
 out.write(postData);
 out.close();

 int responseCode = conn.getResponseCode();
 //here comes the error processing, but I can't reach it, because of
 //the exception.



 if (responseCode == 401 || responseCode == 403) {

//....
}

感谢您的帮助:)。

首先要检查的是——如果您想到了这一点,我向您道歉——您是否在代理服务器(如公司防火墙)后面?如果是这样,超时正是我对上述代码的预期症状。(这件事一直让我抓狂!)

代码的后半部分(来自上的HttpURLConnection声明)未经修改,我看到超时;在我的系统上(在公司防火墙后面),通过两项更改,我得到了200 OK的回复:

  • 添加传递给HttpUrlConnection工厂的代理对象,如下所示:

    Proxy Proxy=newproxy(Proxy.Type.HTTP,newinetsocketaddress(“…”,8080)); HttpURLConnection conn=(HttpURLConnection)url.openConnection(proxy)

  • 接受我的JVM不信任的C2DM服务器的证书。出于测试目的,我覆盖了默认主机名验证器和信任管理器,如中所述。对于生产,您应该考虑更安全的解决方案


我发现了另一件事;这似乎无关紧要,但表示要发布到
https://android.apis.google.com/c2dm/send
,而不是android.clients.google.com-只是需要注意,将来可能会出现问题。

我也遇到了同样的问题

我试过:

URL url = new URL("http://android.apis.google.com/c2dm/send");
而不是:

URL url = new URL("https://android.apis.google.com/c2dm/send");
这对我有用