天天看點

RMI 學習 ------第一個RMI程式

這是看網上例子寫的,記錄了編寫過程和全部源代碼

感覺不是一般的難用啊,配來配去的,不是很友善…………

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