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 帮助程序类来发送消息。

这是超时失败的行。

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

任何帮助,将不胜感激。

问候

账单

4

1 回答 1

8

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

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

总而言之,我最初的问题是我已经在 GCM 和我的本地服务器上注册了模拟器,但是当我点击发送消息时,我遇到了超时。

我最初以为是防火墙,所以我做了一些研究并在 tomcats catalina.properties 文件中设置了代理。这没什么区别。

我使用“Charles”网络代理调试器软件查看消息试图发送到的位置,结果显示为https://android.googleapis.com:443

所以我最初将以下内容添加到我的 catalina.properties 文件中:

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

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

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 在我的公司防火墙内完全正常工作,所以希望这篇文章可以帮助其他一些可怜的草皮在未来这样做。

干杯

账单

于 2012-07-13T07:54:54.343 回答