生活随笔
收集整理的這篇文章主要介紹了
java rmi 入门实例
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
java?rmi?入門實(shí)例
?(2009-06-16 16:07:55) 轉(zhuǎn)載▼
標(biāo)簽:? java ? rmi ? 雜談 | 分類:?java-基礎(chǔ) |
?java rmi即java遠(yuǎn)程接口調(diào)用,實(shí)現(xiàn)了2臺(tái)虛擬機(jī)之間的程序調(diào)用,這樣,網(wǎng)絡(luò)上的任何兩臺(tái)計(jì)算機(jī)就可以相互調(diào)用對(duì)方的程序(如果允許)。
??好了,下面就以經(jīng)典的 Hello world作為例子講解。開發(fā)rmi的步驟如下。 1、編寫遠(yuǎn)程接口,遠(yuǎn)程接口實(shí)現(xiàn)類 2、編譯 3、生成接口實(shí)現(xiàn)類存根 4、在服務(wù)器端啟動(dòng)rmiregistry命令 5、在服務(wù)端注冊(cè)發(fā)布遠(yuǎn)程對(duì)象 6、在客戶端獲取遠(yuǎn)程對(duì)象 實(shí)例: 以下遠(yuǎn)程接口類為HelloRemote,實(shí)現(xiàn)類為HelloImpl,服務(wù)器端的發(fā)布類為RMIServer,客戶端的調(diào)用類為RMIClient,為簡(jiǎn)單考慮,服務(wù)器和客戶端均在同一臺(tái)機(jī)器(所謂服務(wù)器和客戶機(jī),是兩者運(yùn)行在2個(gè)虛擬機(jī)進(jìn)程下)。 一、編寫類 1、遠(yuǎn)程接口類,需基礎(chǔ)java.rmi.Remote接口,且方法拋出RMIException public interface HelloRemote extends Remote{ public void sayHello() throws RemoteException; ?? } 2、遠(yuǎn)程接口實(shí)現(xiàn)類,需繼承UnicastRemoteObject public class HelloImpl extends UnicastRemoteObject ?implements HelloRemote{ public HelloImpl() throws RemoteException { super(); } public void sayHello() throws RemoteException { System.out.println("Hello World!"); } } 3、服務(wù)端類 服務(wù)端類用于發(fā)布遠(yuǎn)程對(duì)象 public class RMIServer { public static void main(String[] args) throws RemoteException, MalformedURLException { HelloRemote hello=new HelloImpl(); Naming.rebind("hello", hello); } } 4、客戶端類 public class RMIClient { public static void main(String args[]) throws MalformedURLException, RemoteException, NotBoundException{
???????????????????????????System.setSecurityManager(new ??RMISecurityManager());//如果服務(wù)器和客戶端不再同一臺(tái)機(jī)器要加這行 HelloRemote hello=(HelloRemote) Naming.lookup("hello");
??hello.sayHello(); } } 遠(yuǎn)程接口類需同時(shí)在服務(wù)端和客戶端存在 二、編譯(注意以上類都沒有包,這里主要是簡(jiǎn)化操作考慮) 客戶端文件夾在 E:/client(簡(jiǎn)稱client),服務(wù)端在E:/server(簡(jiǎn)稱server) 分別編譯以上4個(gè)文件。然后將Hello.class分別放到client和server下,將Client.class放到client下,Server.class放到server下,HelloImpl.class文件放到server文件夾下 三、生成存根和骨架 進(jìn)入server文件夾在命令行下輸入命令 rmic HelloImpl,將生成一個(gè)HelloImpl_Stub.class文件 將此文件復(fù)制到client目錄下(server與client均該文件) 四、
運(yùn)行注冊(cè)程序 在命令行中進(jìn)入server文件夾 輸入命令 rmiregistry,用于啟動(dòng)注冊(cè),在此前需設(shè)置classpath為E:/server,輸入rmiregistry命令后將在server文件夾下生成一個(gè) 五、運(yùn)行服務(wù)類 java Server 六、運(yùn)行客戶類 java Client 你將看到執(zhí)行成功。 當(dāng)你執(zhí)行不順利時(shí),請(qǐng)看看下面: 1、最終執(zhí)行時(shí)要3個(gè)命令行窗口,一個(gè)運(yùn)行rmiregistry,一個(gè)運(yùn)行Server,一個(gè)運(yùn)行Clinet,先執(zhí)行rmiregistry命令,接著執(zhí)行java Server,最后執(zhí)行java Client 2、客戶端和服務(wù)端均要有存根(HelloImpl_Stub.class)和遠(yuǎn)程接口的定義,且包名要一致。 3、當(dāng)運(yùn)行服務(wù)器時(shí),提示找不到HelloImpl_Stub,那是你沒指定類路徑,那請(qǐng)你在執(zhí)行rmiregistry前設(shè)置classpath 4、出現(xiàn)AscessableException訪問非法時(shí),需要修改此略文件,在jre/security目錄下的java.policy文件中(如果你有多個(gè)jre,你無法確定是哪個(gè)。那就全部修改吧),在該文件中添加如下內(nèi)容 grant {
??
??
??
??
?permission java.net.SocketPermission "*:1024-65535",
??
??
??
??
??
??
??"connect,accept";
??
??
??
??
?permission java.net.SocketPermission "*:80","connect";
??
??
??}; 5、指定端口,默認(rèn)是1099,可以在運(yùn)行rmiregistry時(shí)指定 如 rmiregistry 1098,也可以在Server.java中指定,如Registry.
createRegistry(1088). ? 6、綁定地址的設(shè)置 簡(jiǎn)單形式Naming.bind("hello"),本機(jī)地址時(shí)才可以 完全形式Naming.bind("rmi://117.45.220.11:1099/RMI_Hello")
轉(zhuǎn)載于:https://www.cnblogs.com/wshsdlau/p/3532071.html
總結(jié)
以上是生活随笔為你收集整理的java rmi 入门实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。