javarmi
⑴ java相關的技術有哪些
那多了。
1、JDBC(Java Database Connectivity)提供連接各種關系資料庫的統一介面,作為數據源,可以為多種關系資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC為工具/資料庫開發人員提供了一個標準的API,據此可以構建更高級的工具和介面,使資料庫開發人員能夠用純 Java API 編寫資料庫應用程序,同時,JDBC也是個商標名。
2、EJB(Enterprise JavaBeans)使得開發者方便地創建、部署和管理跨平台的基於組件的企業應用。
3、Java RMI(Java Remote Method Invocation)用來開發分布式Java應用程序。一個Java對象的方法能被遠程Java虛擬機調用。這樣,遠程方法激活可以發生在對等的兩端,也可以發生在客戶端和伺服器之間,只要雙方的應用程序都是用Java寫的。
4、Java IDL(Java Interface Definition Language) 提供與CORBA(Common Object Request Broker Architecture)的無縫的互操作性。這使得Java能集成異構的商務信息資源。
5、JNDI(Java Naming and Directory Interface)提供從Java平台到的統一的無縫的連接。這個介面屏蔽了企業網路所使用的各種命名和目錄服務。
6、JMAPI(Java Management API)為異構網路上系統、網路和服務管理的開發提供一整套豐富的對象和方法。
7、JMS(Java Message Service)提供企業消息服務,如可靠的消息隊列、發布和訂閱通信、以及有關推拉(Push/Pull)技術的各個方面。
8、JTS(Java transaction Service)提供存取事務處理資源的開放標准,這些事務處理資源包括事務處理應用程序、事務處理管理及監控。
9、JMF(Java Media Framework API), 她可以幫助開發者把音頻、視頻和其他一些基於時間的媒體放到Java應用程序或applet小程序中去,為多媒體開發者提供了捕捉、回放、編解碼等工具,是一個彈性的、跨平台的多媒體解決方案。
10、Annotation(Java Annotation),在已經發布的JDK1.5(tiger)中增加新的特色叫 Annotation。Annotation提供一種機制,將程序的元素如:類,方法,屬性,參數,本地變數,包和元數據聯系起來。這樣編譯器可以將元數據存儲在Class文件中。這樣虛擬機和其它對象可以根據這些元數據來決定如何使用這些程序元素或改變它們的行為。
在Java技術中,值得關注的還有JavaBeans,它是一個開放的標準的組件體系結構,它獨立於平台,但使用Java語言。一個JavaBean是一個滿足JavaBeans規范的Java類,通常定義了一個現實世界的事物或概念。一個JavaBean的主要特徵包括屬性、方法和事件。通常,在一個支持JavaBeans規范的開發環境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可視地操作JavaBean,也可以使用JavaBean構造出新的JavaBean。JavaBean的優勢還在於Java帶來的可移植性。現在,EJB (Enterprise JavaBeans) 將JavaBean概念擴展到Java服務端組件體系結構,這個模型支持多層的分布式對象應用。除了JavaBeans,典型的組件體系結構還有DCOM和CORBA,關於這些組件體系結構的深入討論超出了本書的范圍。
11、javaFXSun剛剛發布了JavaFX技術的正式版,它使您能利用 JavaFX 編程語言開發富互聯網應用程序(RIA)。JavaFX Script編程語言(以下稱為JavaFX)是Sun微系統公司開發的一種declarative, staticallytyped(聲明性的、靜態類型)腳本語言。JavaFX技術有著良好的前景,包括可以直接調用Java API的能力。因為 JavaFXScript是靜態類型,它同樣具有結構化代碼、重用性和封裝性,如包、類、繼承和單獨編譯和發布單元,這些特性使得使用Java技術創建和管理大型程序變為可能。
12、JMX(Java Management Extensions,即Java管理擴展)是一個為應用程序、設備、系統等植入
管理功能的框架。JMX可以跨越一系列異構操作系統平台、系統體系結構和網路傳輸協議,靈活的開發無縫[1][2][3][4][5][6]
集成的系統、網路和服務管理應用。
13、JPA (Java Persistence API), JPA通過JDK 5.0註解[7]或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到資料庫中。
⑵ 哪些埠是通過java RMI連接使用
RMI的優勢
這種機制給分布計算的系統設計、編程都帶來了極大的方便。只要按照RMI規則設計程序,可以不必再過問在RMI之下的網路細節了,如:TCP和Socket等等。任意兩台計算機之間的通訊完全由RMI負責。調用遠程計算機上的對象就像本地對象一樣方便。
1、面向對象:
RMI可將完整的對象作為參數和返回值進行傳遞,而不僅僅是預定義的數據類型。也就是說,可以將類似Java Hash表這樣的復雜類型作為一個參數進行傳遞。
2、可移動屬性:
RMI可將屬性從客戶機移動到伺服器,或者從伺服器移動到客戶機。
3、設計方式:
對象傳遞功能使你可以在分布式計算中充分利用面向對象技術的強大功能,如二層和三層結構系統。如果用戶能夠傳遞屬性,那麼就可以在自己的解決方案中使用面向對象的設計方式。所有面向對象的設計方式無不依靠不同的屬性來發揮功能,如果不能傳遞完整的對象——包括實現和類型——就會失去設計方式上所提供的優點。
4、安全性:
RMI使用Java內置的安全機制保證下載執行程序時用戶系統的安全。RMI使用專門為保護系統免遭惡意小程序侵害而設計的安全管理程序。
5、便於編寫和使用
RMI使得Java遠程服務程序和訪問這些服務程序的Java客戶程序的編寫工作變得輕松、簡單。遠程介面實際上就是Java介面。為了實現RMI的功能必須創建遠程對象任何可以被遠程調用的對象必須實現遠程介面。但遠程介面本身並不包含任何方法。因而需要創建一個新的介面來擴展遠程介面。新介面將包含所有可以遠程調用的方法。遠程對象必須實現這個新介面,由於新的介面擴展了遠程介面,實現了新介面,就滿足了遠程對象對實現遠程介面的要求,所實現的每個對象都將作為遠程對象引用。
一個國外的PPT上還還總結到:
Java RMI Advantages:
Full object support
Cross platform. capabilities
Robust communications
Large objects
Security for client and servers
Distribution/updates of codes
RMI的劣勢
從上面的過程來看,RMI對伺服器的IP地址和埠依賴很緊密,但是在開發的時候不知道將來的伺服器IP和埠如何,但是客戶端程序依賴這個IP和埠。這也是RMI的局限性之一。這個問題有兩種解決途徑:一是通過DNS來解決,二是通過封裝將IP暴露到程序代碼之外。
RMI的局限性之二是RMI是Java語言的遠程調用,兩端的程序語言必須是Java實現,對於不同語言間的通訊可以考慮用Web Service或者公用對象請求代理體系(CORBA)來實現。
一個國外的PPT上也總結到:
Java RMI Disadvantages:
Java RMI only supports Java
Proprietary protocol by single vendor
Requires RMI-lookup
Requires non-standard port
RMI與Socket的比較
RMI技術比較socket的網路編程主要有以下幾個方面:
第一、RMI是面向對象的,而後者不是。
第二、RMI是與語言相綁定的。比如當你使用Java RMI技術的時候,客戶端與伺服器端都必須使用Java開發。而socket的網路編程是使用獨立於開發語言的,甚至獨立於平台。基於socket的網路編程,客戶端與伺服器端可以使用不同開發語言和不同的平台。
第三、從網路協議棧的觀點來看,RMI與socket的網路編程處於不同層次上。基於socket的網路編程位於TCP協議之上,而RMI在TCP協議之上,又定義了自己的應用協議,其傳輸層採用的是Java遠程方法協議(JRMP)。可見,在網路協議棧上,基於RMI的應用位置更高一些,這也決定了,與socket的網路編程相比,RMI會喪失一些靈活性和可控性,但是好處是它帶給了應用開發者更多的簡潔,方便和易用。比如:如果你用的是RMI,你不需要關心消息是怎麼序列化的,你只需要像本地方法調用一樣,使用RMI。代價是:應用開發者無法很好地控制消息的序列化機制。
第四、這是最後一點不同,我認為也是比較重要的一點,就是兩種方法的性能比較,其往往決定著你將使用那種技術來開發你的應用。
實驗的結果是:RMI與TCP based socket相比,傳輸相同的有效數據,RMI需要佔用更多的網路帶寬(protocol overhead)。從這里,我們可以得出一個一般性的結論:RMI主要是用於遠程方法的」調用「(RMI是多麼的名符其實:)),其技術內涵強調的是 「調用」,基於此,我能想到的是:移動計算,和遠程式控制制,當你的應用不需要在client與server之間傳輸大量的數據時,RMI是較好的選擇,它簡潔、易於開發。但是,一旦你的應用需要在client與server之間傳輸大量的數據,極端的,比如FTP應用,則RMI是不適合的,我們應該使用 socket。
PS: RMI的效率還是很高的,一般情況下會比Hessian更高效,比Web Service更是高效很多;當然和socket這種東東相比,當然要低效一點了,socket更底層一些啊。RMI的具體實現,依然是依賴於底層的Socket編程。
一個簡單的RMI系統,一般可以分成4個文件,下面來介紹各個文件的創建和作用
第一步:創建一個遠程對象介面
import java.rmi.Remote;
import java.rmi.RemoteException;
/*
* 這個介面繼承自Remote,每一個定義的方法都必須拋出一個RemoteException異常對象
* 我們可供遠程調用的方法就是通過這里開公開
*/ public interface IRMI extends Remote{
public String invoke() throws RemoteException;
} 12345678910
第二步:創建介面的具體實現類
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/*
* 遠程對象的實現
* 公開方法的具體實現就是這里定義的
*/ public class IRMIImpl extends UnicastRemoteObject implements IRMI {
protected IRMIImpl() throws RemoteException {
super(); // 這個實現必須有一個顯式的構造函數,並且要拋出一個RemoteException異常
}
private static final long serialVersionUID = 6131922116577454476L;
public String invoke() throws RemoteException { //該方法公開
return "hello,world!";
}
public String tryInvoke() throws RemoteException{ //該方法未公開,若要公開請在介面中定義
return "try to remote me";
}
}
第三步:創建RMI伺服器
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
/*
* 遠程對象的注冊類 該類應該在伺服器端執行,執行之後
* 該機器將變為RMI伺服器 客戶端可以通過正確的url來訪問
* 伺服器上的遠程對象,執行對外報露的方法
*/ public class RMIServer {
static int port = 8888;
/*
* 創建一個Registry對象.
* LocateRegistry用於獲取名字服務或創建名字服務.
* 調用LocateRegistry.createRegistry(int port)方法可以在某一特定埠創建名字服務,從而用戶無需再手工啟動rmiregistry
* @return 返回一個Registry對象
*/
private static Registry createRegistry() {
Registry registry = null;
try {
registry = LocateRegistry.getRegistry(port); //如果該埠未被注冊,則拋異常
registry.list(); //拿到該埠注冊的rmi對象
} catch (final Exception e) {
try {
registry = LocateRegistry.createRegistry(port);//捕獲異常,埠注冊
} catch (final Exception ee) {
ee.printStackTrace();
}
}
return registry;
}
/**
* 將對象注冊到rmi伺服器上
*/
public static void bind() {
Registry registry = createRegistry();
try {
IRMIImpl impl = new IRMIImpl();
registry.rebind("mytask", impl); //這就是綁定,client里lookup必須和"mytast"一樣才能遠程調用impl
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
bind();
} catch (Exception e) {
e.printStackTrace();
}
}
}
上面是一種比較好的寫法,如果只是要測試,可以直接在main()方法中寫:
ImplementClass ic = new ImplementClass(); //具體實現類
Registry r = LocateRegistry.createRegistry(8888);
r.bind("mytask", ic);
//Naming.rebind("rmi://localhost:8888/mytask", ic); 可替換上句 1234
1.注冊一個埠 2.在注冊埠綁定taskName和implementClass 3.客戶端就可以通過url和taskName來找到implementClass。
第四步:創建RMI客戶端
import java.rmi.Naming;
public class RMIClient {
/**
* 調用遠程對象中的方法
* @throws Exception
*/
public static void getRemoteObject() throws Exception{
/*得到遠程發布的服務
返回與指定 name 關聯的遠程對象的引用(一個stub)*/
IRMI obj = (IRMI)Naming.lookup("rmi://localhost:"+RMIServer.port+"/mytask"); //註:通過介面拿
System.out.println(obj.invoke()); //調用遠程服務的方法
}
public static void main(String[] args) {
try {
getRemoteObject();
} catch (Exception e) {
e.printStackTrace();
}
}
} 24
運行RMI系統:啟動RMI伺服器,啟動客戶端即可。