C2DM中的HTTP Post提供SocketTimeoutException

时间:2011-08-01 14:07:36

标签: java android servlets

我做了一个应用程序。适用于使用Google的C2DM服务的Android。一世  从一些教程制作服务器模拟器,它工作正常。我的  问题是,我试图构建一个Java Servlet。来自Android设备  收到罚款并保存注册ID,但是当我  尝试始终向Google C2DM服务器发送https POST请求  获取SocketTimeoutException:获取时超时: https://android.clients.google.com/c2dm/send。  我不明白为什么在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) {

//....
}

感谢您的帮助:)。

2 个答案:

答案 0 :(得分:0)

要检查的第一个显而易见的事情是 - 如果您已经想到这一点我道歉 - 您是否在代理服务器后面,例如公司防火墙?如果是这样,超时就是我对上述代码所期望的症状。 (这一直让我抓狂!)

使用后半部分代码(来自HttpURLConnection声明),未修改,我看到超时;在我的系统上(在公司防火墙后面),有两个更改,我得到200 OK:

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

    代理代理=新代理(Proxy.Type.HTTP,新InetSocketAddress(“...”,8080)); HttpURLConnection conn =(HttpURLConnection)url.openConnection(proxy);

  • 接受我的JVM不信任的C2DM服务器证书。出于测试目的,我按照Trusting all certificates using HttpClient over HTTPS中的描述覆盖了默认主机名验证程序和TrustManager。对于生产,您应该考虑更安全的解决方案。

我发现的另一件事;它似乎并不重要,但是http://code.google.com/android/c2dm/index.html#push说要发布到https://android.apis.google.com/c2dm/send,而不是发布到android.clients.google.com - 只是需要注意的事情可能会在将来发生。

答案 1 :(得分:0)

我面临同样的问题和

我曾尝试过:

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

而不是:

URL url = new URL("https://android.apis.google.com/c2dm/send");

它对我有用。