2012-07-12 87 views
7

我无法通过公司代理向设备发送消息。
我已经完成了谷歌网站上的GCM教程,并成功地在谷歌服务器上用android模拟器 注册了一个设备,并且也在我的服务器上注册了该设备。
为此我必须通过公司代理,将其设置在模拟器的访问点中。 现在我遇到的问题是通过相同的代理从我的服务器向设备发送消息。 我使用从使用Google代理通过代理传递GCM

com.google.android.gcm.server.Sender 

辅助类来发送消息的演示servlet代码。

我跑我已经尝试设置代理了在catalina.properties文件,像这样在Tomcat 7

Servlet的。

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

我试过在下面的servlet中设置属性。

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

但我仍然得到超时。 我知道它的公司代理服务器,因为我的邮件在家里没有代理服务器。

我看到了一个在java代码中创建的代理对象,然后创建了一个连接,但我不认为这是可用的,因为我使用发件人帮助器类来发送消息。

这是在超时失败的行。

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

任何帮助,将不胜感激。

问候

比尔

+0

OK我有这种略带进展。我发现传出的消息是在端口443上使用SSL。因此,我在catalina.properties文件中添加了一个用于https代理的条目,使用与http代理相同的值,并且似乎允许消息传出。然而,这个消息没有到达模拟器,而是我在logcat中得到一个错误,指出以下内容:[GTalkConnection.12] doConnect:抓住XMPPError连接到mtalk.google.com:5228 .: - 由:java.net引起。 SocketException:操作超时 这让我感到惊讶,因为我认为服务是使用端口5228注册的。 – billby 2012-07-13 06:53:56

回答

8

好吧,我终于有工作。在我的评论中,我提到我已经成功发出了这个信息,但是模拟器并没有收到它。我忘记按照自己早期的建议,从命令行运行仿真器,代理参数如下设置:

emulator.exe -avd avd22google -http-proxy proxy.company.com:8080 -debug-proxy所以总结起来,我最初的问题是我在GCM和本地服务器上注册了模拟器,但是当我点击发送消息时,我正在获取超时。

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

我用了“查尔斯” Web代理调试器软件上看到消息,正在试图发送给它想出了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在我的公司防火墙内完全工作,所以希望这篇文章可以帮助其他一些可怜的草药在未来做到这一点。

欢呼

比尔