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
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{
HelloRemote hello=(HelloRemote) Naming.lookup("hello");
}
}
遠(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 {
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") |
|