????????很久之前我們在學習Java的時候追求著sun,當然RMI也不會放過,很多人在學習RMI的時候都覺得RMI沒有實用價值,其實并不是的,那么接下來就讓小編為大家介紹RMI的學習小結。
????????在寫這篇文章前也訪問了中國電信的高級工程師,根據他的介紹,RMI?有很多實現方式,而且現在他發現?RMI?在大規模分布式系統中,效率和性能不是很好。目前他帶領的團隊正在自行開發分布式應用。
????????隨著?web?2.0?時代的到來,SOA?開發思想的普及應用。分布式應用,將又一次走向高潮。
????????RMI??開發步驟大家都很清楚,這里舉個不用手動啟動?rmiRegistry,?也不要指定?codebase?和web?server?的例子.底層?TCP/IP?細節我們不用去管他,你就把他看成像?SOAP、JNDI?等一樣的基于注冊服務的東西就行了??.
1.?遠程接口
import?java.rmi.Remote;
import?java.rmi.RemoteException;
public?interface?IRMI?extends?Remote?{
?public?Object?invoke(ITask?task)?throws?RemoteException;
}
2.遠程接口實現
/**
?*?@author?Jack.Wang
?*?
?*/
import?java.rmi.RemoteException;
import?java.rmi.server.UnicastRemoteObject;
public?class?IRMIImpl?extends?UnicastRemoteObject?implements?IRMI?{
?protected?IRMIImpl()?throws?RemoteException?{
??super();
?}
?public?Object?invoke(ITask?task)?throws?RemoteException?{
??System.out.println("注意:這是一個遠程調用");
??Object?obj?=?task.doWork();
??System.out.println("調用ITask.doWork()方法的返回值:"?+?obj.toString());
??//?客戶端調用,可以在服務器端播放需要的音樂
??ProcessCaller.callMp3();
??return?obj;
?}
}
3.??任務接口
/**
?*?@author?Jack.Wang
?*?
?*/
import?java.io.Serializable;
public?interface?ITask?extends?Serializable?{
?public?Object?doWork();
}
4.??任務實現類
/**
?*?@author?Jack.Wang
?*?
?*/
public?class?TaskImpl?implements?ITask?{
?public?Object?doWork()?{
??System.out.println("當前程序處于遠程調用中");
??return?Thread.currentThread().getName()?+?"?"
????+?new?Date(System.currentTimeMillis());
?}
}
5.在java中調用windows程序
public?class?ProcessCaller?{
?public?static?void?callMp3()?{
??Runtime?ru?=?Runtime.getRuntime();
??try?{
???//?調用播放器文件播放指定MP3
???Process?p1?=?ru
?????.exec("C://Program?Files//Windows?Media?Player//wmplayer?D://Jack//Mp3//5.秋天不回來-王強.mp3");
??}?catch?(Exception?e)?{?
??}
?}
}
6.?Server?端代碼?
/**
?*?@author?Jack.Wang
?*?
?*/
import?java.rmi.Naming;
import?java.rmi.registry.LocateRegistry;
import?java.rmi.registry.Registry;?
public?class?RMIServer?{
?public?static?void?registRemoteObject()?throws?Exception?{
??IRMIImpl?impl?=?new?IRMIImpl();
??Naming.rebind("rmi://210.43.109.25:1111/mytask",?impl);
??System.out.println("bound?success!");
?}?
?private?static?Registry?createRegistry()?{
??Registry?registry?=?null;
??int?port?=?1111;
??try?{
???registry?=?LocateRegistry.getRegistry("210.43.109.25",?port);
???registry.list();
???System.out.println("Register?the?exist?server!");
??}?catch?(final?Exception?e)?{
???try?{
????registry?=?LocateRegistry.createRegistry(port);
????System.out.println("Register?the?exist?server!port="?+?port);
???}?catch?(final?Exception?ee)?{
????ee.printStackTrace();
???}
??}
??return?registry;
?}?
?/**
??*?將對象注冊到rmi服務器上
??*/
?public?static?void?bind()?{
??Registry?registry?=?null;
??registry?=?createRegistry();
??try?{
???IRMIImpl?impl?=?new?IRMIImpl();
???registry.rebind("mytask",?impl);
???System.out.println("mytask?server?start!");
??}?catch?(Exception?e)?{
???e.printStackTrace();
??}
?}?
?/**
??*?@param?args
??*/
?public?static?void?main(String[]?args)?{
??try?{
???bind();
??}?catch?(Exception?e)?{
???e.printStackTrace();
??}
?}?
}
7.?Client?端代碼
/**
?*?@author?Jack.Wang
?*?
?*/?
public?class?RMIClient?{
?public?static?void?getRemoteObject()?throws?Exception?{
??IRMI?obj?=?(IRMI)?Naming.lookup("rmi://210.43.109.28:1111/mytask");?//?得到遠程發布的服務
??TaskImpl?task?=?new?TaskImpl();
??Object?result?=?obj.invoke(task);?//?調用遠程服務的方法
??System.out.println(result.toString());
?}?
?public?static?void?main(String[]?args)?{
??try?{
???getRemoteObject();
??}?catch?(Exception?e)?{
???e.printStackTrace();
??}
?}
}
小結:
????????建議把以上程序打包成?jar?文件,你可以在不同機子間測試。
????????RMI?就這么簡單,如果你覺得他不爽,就自己封裝?socket.?到時候要通知我哦,我也學習學習。
????????上文就是RMI的學習小結,其實在學習的過程中學術理論和實踐是不能夠分離的,所以我們在學習的過程中需要將它們結合才能發揮出最大的用處。
新聞熱點
疑難解答