2013-03-20 22 views
4

使用App Engine可信測試套接字連接到APNS。寫入套接字工作正常。應用引擎:將套接字打開時間超過2分鐘

但問題是,插座被兩分鐘沒有後回收。它在Trusted Tester網站上表示,任何套接字操作都會使套接字保持活動狀態2分鐘。在APNS決定關閉連接之前,保持插座打開更好。

在嘗試了幾乎所有的Socket API方法寫入輸出流之後,無論如何2分鐘後Socket都會關閉。我錯過了什麼?

部署在java後端。

回答

0

你試過getSoLinger()嗎?這可能是當前可用的(類型)getSocketOpt,它可能會重置2分鐘的超時時間。理論上,也可以做一個零字節讀取,但我不確定如果你嘗試這樣做,那麼在輸入流上使用這種方法。

公衆詮釋讀(字節B [],詮釋掉,INT len)將

如果這些建議不工作,請提交與App Engine的問題跟蹤器的問題。

還會有一些其他的修復,例如,使用插座選項等。

+0

感謝您的回覆。我曾嘗試讀(新字節[0]),但它沒有工作,這是一樣的做讀(_,0,0)?我確實嘗試了#setSoTimeout,但沒有奏效。這是否與#setSoLinger相同。 – 2013-04-22 13:37:18

+0

這對你來說還是碎了嗎? – ozzee 2013-06-04 07:49:51

+0

我無法再使用GAE。當我這樣做時,我會重新檢查一下。到目前爲止,Sockets上的方法都沒有爲超時做任何事情。 – 2013-06-04 18:03:36

0

使用getpeername()

https://developers.google.com/appengine/docs/java/sockets/overview ...

套接字2分鐘不活動之後,可以回收; 任何插座 操作(例如getpeername)保持所述插座活着另外2 分鐘。 (請注意,你不能在多個可用 插座之間選擇,因爲這需要其目前不支持 java.nio.SocketChannel。)

1

你不能把連接到APNS人爲地開放的插座;而不發送實際的推送通知。保持開放的唯一方法是發送一些任意的數據/字節,但這會導致套接字立即關閉;只要APNS檢測到不符合協議的內容,即APNS關閉連接,即不是實際的推送通知。

SO_KEEPALIVE

SO_KEEPALIVE

什麼? App Engine明確表示它受到支持。我認爲這只是意味着當你致電Socket.setKeepAlive(true)時,它不會拋出異常;調用想要設置的套接字選項之前未引發異常。即使您啓用保持活動狀態,如果您不會發送超過2分鐘的內容,您的套接字將被回收(關閉);至少在App Engine上是截至目前的。

實際上,這不是一個大的驚喜。 RFC1122,指定TCP Keep Alive明確指出TCP Keep Alive不會每兩個小時發送一次,然後只有在沒有其他流量時才需要發送。雖然它也說這個時間間隔也必須是可配置的,但您可以使用java.net.Socket上的API(很可能是因爲它與操作系統高度相關),並且我懷疑它會在App Engine上設置爲2分鐘。

SO_TIMEOUT

SO_TIMEOUT

什麼?這是完全的東西。的Socket.setSoTimeout()狀態的Javadoc:

啓用與指定的超時/禁用SO_TIMEOUT,以毫秒爲單位。如果將此選項設置爲非零超時,則與此Socket關聯的InputStream上的read()調用將僅阻塞這段時間。如果超時過期,則會引發java.net.SocketTimeoutException,但Socket仍然有效。該選項必須在進入阻止操作生效之前啓用。超時值必須大於0.超時值爲零將被解釋爲無限超時。

也就是說,當read()阻止太久,因爲沒有什麼閱讀,你可以說:「好吧,我不想等待(塊)了;讓我們做點別的。」這不會對我們的「2分鐘」問題有所幫助。

What then?

可以解決這個問題的唯一方法是這樣的:檢測何時連接被回收/關閉,然後把它扔掉,然後打開一個新的連接。還有一個圖書館正好支持這一點。

退房​​。

這是對谷歌App Engine的一個開放源代碼這是專門設計的,(和使用)的Java APNS庫。

https://github.com/ZsoltSafrany/java-apns-gae

相關問題