這是看網上例子寫的,記錄了編寫過程和全部源代碼
感覺不是一般的難用啊,配來配去的,不是很友善…………
RMI:使用戶端能夠調用調用伺服器端的對象的方法。
先看一下伺服器端的需要做的事情。
1 被用戶端調用的類。
這裡包括兩部分:
1 一個接口,定義了可以被用戶端調用的方法。
2 一個類,實作了上面接口的類。
接口必須實作java.rmi.Remove
完整代碼:
package com.hf.rmi.server.test;
import java.rmi.*;
public interface PerfectTimeI extends Remote {
long getPerfectTime() throws RemoteException;
}
類:
package com.hf.rmi.server.test;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import java.net.*;
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
public long getPerfectTime()
throws RemoteException {
return System.currentTimeMillis();
}
public PerfectTime() throws RemoteException {
super();
}
public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTime pt = new PerfectTime();
Naming.rebind(
"//172.168.1.141:2005/PerfectTime" , pt);
System.out.println("Ready to do time");
} catch(Exception e) {
e.printStackTrace();
}
}
}
繼承了UnicastRemoteObject并且實作了上面定義的接口。
為了友善,直接在目前類的main方法中建立了對象并啟動了綁定
調用rmic指令建立stub
Rmic com.hf.rmi.server.test.PerfectTime
這就會生成兩個類:PerfectTime_Skel.class,PerfectTime_Stub.class。其中第二個我們在用戶端需要用到。
下面看一下用戶端代碼:
首先建立一個調用伺服器端的類:
package com.hf.rmi.client.test;
import java.rmi.*;
import com.hf.rmi.server.test.PerfectTimeI;
public class DisplayPerfectTime {
public static void main(String[] args) {
System.setSecurityManager(
new RMISecurityManager());
try {
PerfectTimeI t =
(PerfectTimeI)Naming.lookup(
"rmi://172.168.1.141:2005/PerfectTime");
for(int i = 0 ; i < 10; i++)
System.out.println("Perfect time =" +
t.getPerfectTime());
} catch(Exception e) {
e.printStackTrace();
}
}
}
我們需要注意的是:在裡面用到了PerfectTimeI 類。這個其實就是伺服器端的那一個類。直接從伺服器端拷過來就成了,注意要放到和伺服器端相同的包下。
再将PerfectTime_Stub.class拷貝過來,也放置到同伺服器端一緻的位置上。
下面我們需要修改一下jdk的一些設定,
在jdk目錄下的這個檔案/YOUR_JDK_PATH/jre/lib/security/java.policy
的最後加入下面代碼:
grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.net.SocketPermission "*:80","connect";
據說是開放了端口權限
接下來我們需要啟動rmi
2 start rmiregistry 2005
運作伺服器端程式:
cd D:/eclipse/workspace/RMIServer
進入伺服器端路徑
運作
Java -Djava.rmi.server.codebase=file:/D:/eclipse/workspace/RMIServer/ com.hf.rmi.server.test.PerfectTime
這裡的“-Djava.rmi.server.codebase=file:/D:/eclipse/workspace/RMIServer/”主要是用來指定殘根所在的位置。
這時候就會啟動服務了。
cd D:/eclipse/workspace/RMIClient
運作 java com.hf.rmi.client.test.DisplayPerfectTime