使用代理的方式进行Google云消息传递(GCM)

7

我在通过公司代理向设备发送消息时遇到了问题。
我在谷歌网站上完成了GCM教程,成功地将Android模拟器上的设备注册到了谷歌服务器和我自己的服务器上。
为此,我必须通过公司代理,将其设置在模拟器的接入点中。
现在我的问题是如何通过相同的代理从我的服务器向设备发送消息。
我正在使用演示中使用的servlet代码。

com.google.android.gcm.server.Sender

发送消息的辅助类。

我正在运行 Tomcat 7 上的 servlet。

我尝试在 catalina.properties 文件中进行代理设置,如下所示。

http.proxyHost=proxy.company.com  
http.proxyPort=8080

我尝试在servlet内部设置属性,如下所示。

System.setProperty("http.proxyHost", "proxy.company.com");  
System.setProperty("http.proxyPort", "8080"); 

但是我仍然遇到了超时的问题。我知道这是公司代理的原因,因为我在家中没有代理的情况下让消息传递正常。

我在java代码中看到创建了一个代理对象,然后使用它创建了一个连接,但我认为这在这里是不可用的,因为我正在使用Sender helper类来发送消息。

这是一条会在超时时失败的代码行。

Result result = sender.send(message, registrationId, 5);

任何帮助都将不胜感激。
敬礼,
比尔

好的,我在这方面有了一些进展。我发现出站消息正在使用端口443上的SSL。因此,我在catalina.properties文件中添加了一个https代理条目,使用与http代理相同的值,似乎允许消息发送出去。然而,消息没有到达模拟器,而是在logcat中出现以下错误:[GTalkConnection.12] doConnect: caught XMPPError connecting to mtalk.google.com:5228.: -- caused by: java.net.SocketException: The operation timed out。这让我感到惊讶,因为我认为该服务是使用端口5228注册的。 - billby
1个回答

8

好的,我终于让它工作了。在我的评论中,我提到我已经成功发送消息,但模拟器没有接收到它。我忘记了遵循自己早期的建议,并使用以下命令从命令行运行模拟器并设置代理参数:

emulator.exe -avd avd22google -http-proxy proxy.company.com:8080 -debug-proxy

因此,总结一下,我的初始问题是我已经将模拟器注册到GCM和我的本地服务器上,但当我单击发送消息时,会出现超时。

我最初认为是防火墙问题,所以我进行了一些研究,并在tomcats catalina.properties文件中设置了代理。但这没有任何效果。

我使用“Charles” Web代理调试软件查看消息尝试发送到哪里,发现它是https://android.googleapis.com:443

因此,我最初在catalina.properties文件中添加了以下内容:

https.proxyHost=proxy.company.com  
https.proxyPort=443

仍然无法工作。我的一位同事告诉我,我们公司代理通过8080端口处理所有类型的请求,因此我将端口行更改为:

https.proxyPort=8080

这使得消息得以发送出去。 但是,消息未能传递到模拟器中,我在LogCat中收到以下错误信息。

[GTalkConnection.12] doConnect: caught XMPPError connecting to mtalk.google.com:5228.: -- caused by: java.net.SocketException: The operation timed out

我记得你需要通过命令行启动模拟器才能让它使用代理。一旦我这样做了,我的模拟器上就出现了大量消息!

所以最终我将GCM完全在公司防火墙内运行起来了。我花了大约一周的时间来实现这个目标,希望这篇文章能够帮助未来的那些可怜人。

谢谢。

Bill


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接