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