2009-01-16 154 views
0

我正在編寫一個客戶機/服務器應用程序,它應該基於消息工作。我希望儘可能地重複使用,而不是寫另一個實現,並好奇別人正在使用什麼。最佳Java支持的服務器/客戶端協議?

特點圖書館應提供:

  • 客戶端和服務器端功能
  • 應該工作基於消息的
  • 支持多線程的背後負載平衡器
  • 應該工作/防火牆

我用HTTPCore做了幾個測試,但底線是必須實現客戶端和服務器,只有傳輸層纔會被覆蓋。由於網絡相關的要求,RMI不是一種選擇。

任何想法,高度讚賞。


詳細

我的想法是實現其處理客戶端通信的客戶端/服務器的包裝(包括用戶名/密碼驗證),並傳入的請求JMS隊列中寫道:

#1 User --> Wrapper (Check for user/password) --> JMS --> "Server" 
#2 User polls Wrapper which polls JMS 

單獨的進程將處理請求,並可以通過包裝器回覆客戶端。我想使用JMS,因爲:

  • 它處理持久性不錯
  • 負載均衡 - 這很容易通過增加額外的服務器作爲消費者來處理高峯
  • JMSTimeToLive派上用場太

不幸的是,我沒有看到自己使用JMS的方法,因爲客戶端應該只能訪問他們的消息,並且在JMS端安裝不同的用戶聽起來也不可行。

回答

3

那麼,HTTP可能是實現它的客戶端和服務器代碼方面最好的支持 - 但根據您的要求它可能完全不合適。我們需要實際上請參閱一些要求(或者至少對應用程序是什麼樣的模糊概念),然後才能真正爲您提供建議。

1

我想說最好的支持,如果不是最好的實現,Java的客戶端/服務器通信包是Sun的RMI(遠程方法調用)。它包含在標準的Java類庫中,即使它不是最快的選項,也能完成工作。當然,它是由Sun支持的。幾年前,我實現了一個基於回合的遊戲框架,並且非常穩定。

0

我們正在標準化Adobe的AMF,因爲我們在客戶端和Java6/Tomcat6/BlazeDS/Spring-Framework2.5/iBATIS2.3.4/ActiveMQ-JMS5.2中使用Adobe Flex/AIR, -tier堆棧(Oracle 10g後端)。因爲我們正在對Flex客戶端開發進行標準化,所以AMF和BlazeDS(現在更好地結合到Spring,這要感謝Adobe和SpringSource在集成上進行合作),這是我們可以使用的最有效和最方便的方式來與服務器端。

我們還大量建立在數據中心的JMS消息 - BlazeDS的,使我們能夠彌補我們的Flex客戶端的JMS主題訂閱。這是非常強大和有效的。

我們的Flex .swf文件的Java .class代碼被捆綁到了部署的同一.jar文件。這樣,客戶端代碼的正確版本將被部署到與處理客戶端服務調用(或消息傳遞操作)的相應中間層java代碼進行交互。這一直是客戶端 - 服務器計算的禍根 - 確保各層的正確版本彼此連接。我們用我們特定的打包和部署方法有效地解決了這個古老的問題。

我們所有的客戶機 - 服務器交互工作在HTTP/HTTPS端口80和443,即使在服務器端消息推動,我們與橋接我們ActiveMQ的JMS消息代理BlazeDS的事。

2

RMI很適合我們。有一些限制,例如無法直接連接到該計算機(如果客戶端位於防火牆後面不起作用),則無法向客戶端回叫。您還可以輕鬆地將通信封裝到SSL中,或者通過可以封裝在SSL中的HTTP進行隧道傳輸。

如果你最終使用這個記得總是設置分配給客戶端類串行版本。您可以在創建它時將其設置爲1L,或者如果客戶端已經有該類使用serialver.exe來發現現有的類的序列。否則,只要您更改或添加公共方法或與現有客戶端的變量兼容性就會中斷。

靜態最後的serialVersionUID長= 1L

編輯:即進入服務器的每個RMI請求獲得了它自己的線程。你不必自己處理。

編輯:我想稍後在問題中添加一些細節。您可以通過HTTP傳輸RMI,然後您可以使用負載均衡器。

我最近開始玩Hessian,它顯示了很多的承諾。它本身使用HTTP,它比RMI over HTTP更簡單,它是一個二進制協議,這意味着它比所有基於XML的協議都快。得到Hessian很容易。我最近通過在我們的應用中嵌入Jetty來完成這項工作,配置Hessian Servlet並使其實現我們的API接口。關於Hessian的偉大之處在於它的簡單性......就像JMS或HTTP上的RMI一樣。在其他語言中也有用於Hessian的庫。

1

它難以使基於給出的信息,但有可能使用TemporaryQueues的例如一個建議以每個客戶端爲基礎動態創建PTP目標可能適合問題?

Here是一個合理的概述。

+0

嗨吉姆,哪些信息是我想念的補充? Tkx鏈接到這篇文章很遺憾,不幸的是TemporaryQueues的方法不起作用,因爲它至少需要一個靜態隊列。 「壞人」很容易在那裏訪問消息並濫用臨時隊列。 – MrG 2009-01-16 17:14:36

1

使用Spring ....然後挑選的協議。

相關問題