2011-01-19 15 views
7

什麼是用於客戶端/服務器或P2P通信的「官方」Java API? Java RMI?一些其他的網絡API?用於客戶端/服務器通信的Java標準

是這樣的官方網絡API標準爲均爲 SE和EE?

我敢肯定的答案是非常上下文特定的,所以讓我們來看看幾個例子:

  1. 您安裝2臺2級擺動的客戶端和連接到同一個網絡(或互聯網),你想要麼他們送對方一個原始的,比如整數4,或一些POJO,就像一個「小工具」對象
  2. 同上#1,但一個Swing客戶端和fully-之間兼容的Java EE後端(執行管理的bean,應用服務器,整個九碼)

我沒有具體的應用程序,我只是想知道在Java世界中客戶端 - 客戶端和客戶端 - 服務器通信的「規範」是什麼。

回答

3

如果Java的約束是沒有問題的,RMI是一個非常抽象的解決方案時,它涉及到客戶端和服務器解決方案「交換」的數據(尤其是當數據是可能難以/太多精力的Java類以表示爲文本數據)。只要確保你的對象實現了Serializable,幾乎所有東西都可以通過線傳輸。

如果這個不適合你的帳單,你想砸下來的原始網絡的東西,客戶端 - 服務器架構套接字是Netty一個相當不錯的選擇。

+0

Netty對象和序列化RMI對象經過哪些協議? TCP堆棧? UDP?還有別的嗎?以及如何加密他們的內容? SSL? AES?更強大的東西? – Zac 2011-01-19 15:26:59

1

在J2SE中沒有這樣的東西,最官方的網絡API,所有的J2SE API都是官方的,因爲它們被Sun(現在的Oracle)支持。
這就是說,你應該基於以下標準選擇你的API:

  • 你(或你的團隊)知道如何使用特定的API;
  • 這個API使用簡單/複雜;
  • 你的目標吞吐量是多少?對於性能敏感的應用程序,您可能會被迫使用二進制協議。對於其他情況,您可以使用基於文本的協議。

例如,在兩個客戶端之間,簡單的基於文本的協議就足以傳遞POJO,例如使用Apache MINA或Google協議緩衝區。
這也適用於客戶端和服務器之間。


迴應扎克在評論的問題:

  1. 二進制協議的性能增益來自於你並不需要所有內容轉換成文本形式和背部的事實 - 你只可以通過二進制以最小的變化呈現應用程序內存,例如在BSD套接字API的情況下,從主機字節順序轉換爲網絡字節順序。不幸的是,我不知道有關RMI/Java序列化如何處理對象的細節,但我相信,它仍然比以可讀形式傳遞所有數據快得多;
  2. 是的,MINA和協議緩衝區具有Java API。它們不是Java SE捆綁包的一部分,您必須單獨下載它們。順便說一下,MINA可以使用二進制和可讀序列化,具體取決於您如何使用它。
  3. 你應該定義的「好」的概念不知何故,例如,回答到我上面提到的問題。如果您想通過網絡使用對象,請使用RMI。如果你不這樣做,Netty或MINA就足夠了,無論你會發現哪一個更容易掌握。
+1

請注意:J2SE已經不是了,它被稱爲Java SE超過5年。參考:http://www.java.net/blog/kgh/archive/2005/06/goodbye_j2se_he_1.html – 2011-01-19 15:39:09

+0

謝謝!幾個後續問題:(1)在二進制協議中,POJO和原語是如何編譯/序列化的等等。變成二進制文件,使它們比基於文本的替代文件快得多? (2)MINA和Google協議:他們有Java API,是嗎? (3)什麼是一些好的二進制協議? RMI?網狀?其他? – Zac 2011-01-19 15:42:25

0

對於P2P,Sun一度推JXTA很難。

我也不敢使用RMI進行P2P通信。

-1

J2SE中最常見的可能是RMI或原始套接字。

J2EE應用,每個人(服務器和客戶端)訂閱消息傳送總線是由RMI風格的解決方案完全不同(雖然在最底層的實現仍然可以依靠RMI)。它有助於實現冗餘和故障轉移的自動化。如果你需要這個功能,我相信它也可以在SE中使用。

我沒有使用J2EE相當長一段時間了,所以這可能會改變,但我對此表示懷疑。消息傳遞系統是J2EE的核心組件。

0

RMI是非常標準的Java到Java協議。它內置並且使用非常簡單。大多數j2ee後端也使用rmi進行通信,但這不是唯一的可能性。