2010-03-09 80 views
1

我可能會在這裏問一些,但我對社區有信心,所以值得嘗試。我正在製作一款遊戲,並試圖選擇用於在Java移動客戶端和Java服務器後端之間進行通信的連接類型。如何在Java中使用像TCP套接字這樣的Http連接

Java中的套接字編程很簡單 - 關於這個主題有一個lovely tutorial,雙向通信是微不足道的。

問題在於,在移動客戶端(Android)上,無法保證蜂窩網絡能讓您建立TCP連接。這讓我覺得使用HTTP連接是一種好方法。

HTTP連接是基於請求的,但我需要一種方法將通知從服務器推送到客戶端。看起來這個問題的解決方案是使用「長輪詢」,我已經閱讀了一些內容,但還沒有看到我想要實現的一個簡單示例。

再次我可能會問很多,但這似乎是一個相當普遍的問題,是否有一個庫或框架,我可以導入/使用包裝Http連接並提供雙向長期連接(自動重新連接等) 。我讀了一些關於cometD的書,但似乎沒有一個我可以選擇的Java庫。

我需要的溝通不是沉重的,而是不斷變化的雙向數據流,只是偶爾更新方法來保持遊戲進行。

預先感謝通過我的無知篩選,

加文

+0

但是HTTP是在TCP/IP之上實現的,所以如果網絡不允許TCP,我看不出有什麼幫助。現在如果網絡允許連接 到端口80而不是其他端口(更可能的情況,恕我直言),您可能會決定讓您的非HTTP服務器運行在端口80上。您只需通過HTTP網絡正在進行某種深度包檢測以阻止非HTTP協議。 – 2010-03-09 22:35:45

+0

您會驚訝有多少網絡實際進行這種檢查,或插入透明的HTTP代理。 – leeeroy 2010-03-09 22:51:12

+0

我最近也聽說過遠東地區的移動網絡,只需20秒左右即可超時TCP連接! – 2010-03-10 13:39:07

回答

1

在設備上進行長輪詢在移動設備上有一些缺點。

  • 如果手機在移動,它將不斷鬆開連接,您必須識別並重新建立連接。大多數情況下,如果玩家坐在火車或汽車裏,遊戲將無法使用。
  • 連接將使手機不斷髮送和接收數據,因此使用更高的天線電平。即使你不需要太多的能量來處理,圖形和照亮屏幕,這也可能在播放一小時後耗盡整個電池。

如果你想嘗試一個遊戲,顯示這個問題嘗試平行王國時代的出現。

我想看看alex提出的XMMP。如果您在Android上找不到XMMP圖書館,請使用Smack。 或者看看這個question

+0

我鏈接到與XMPP相關的類似(更好;))問題/答案,包括提及特定於Android的Smack版本。 – 2010-03-10 13:37:32

0

Comet模型試圖解決這個問題:此外,你可以嘗試考慮看看愛立信的Android推庫,它可以封裝一些你想要的(不,我已經選中)重新連接東西g HTTP。有一些Java示例here

您會發現大多數在客戶端上討論ajax/XMLHttpRequest的示例/文章,但您真正需要做的是確保您使用的是使用http/1.1和http keepalive的客戶端庫,以及「poll」循環中的網址。

這個想法是服務器服務器塊,直到有實際的值得注意的時候纔會給你迴應,而http keepalive在請求之間保持與服務器的連接,所以你不用付出設置的代價一個新的TCP連接爲每個請求 - 我假設android已經有一個標準的http庫,它應該爲你處理所有這些,包括重新連接。

在服務器端,Tomcat支持上面的developerworks文章中提到的Comet處理 - 除非你想在一個servlet中「手動」地執行它,這也是非常明智的直到你需要真正擴展客戶端的no .. 。s,並有框架如gwt-comet