2012-07-12 67 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在我的公司防火牆內完全工作,所以希望這篇文章可以幫助其他一些可憐的草藥在未來做到這一點。

歡呼

比爾