java中進行遠程方法調用,能支持分佈式計算。並且可以實現在server的修改,能反應到各個client。
假如server的ip是:192.168.11.2,
server端的代碼如下:
/**
*
*/
package com.vs.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Product extends Remote {
public String getDescription() throws RemoteException;
}
package com.vs.rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ProductImpl extends UnicastRemoteObject implements Product {
private String name;
public ProductImpl() throws RemoteException
{
super();
name = "my rmi";
}
@Override
public String getDescription() throws RemoteException {
return "hello world, " + name;
}
}
/**
*
*/
package com.vs.rmi;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/**
* @author hadoop
*
*/
public class ProductServer {
/**
* @param args
*/
public static void main(String[] args) {
/*
* 創建和安裝一個安全管理器,令其支持 RMI. 作爲 Java 開發包的一部分
*
* 適用於 RMI 唯一一個是 RMISecurityManager.
*
*
*
* if(System.getSecurityManager() == null) {
*
* System.setSecurityManager(new RMISecurityManager());
*
* }
*/
try {
LocateRegistry.createRegistry(8808);
ProductImpl server = new ProductImpl();
Naming.rebind("//192.168.11.2:8808/SAMPLE-SERVER", server);
System.out.println("遠程對象註冊成功, RMI 服務已經啓動,等待客戶端調用 ....");
} catch (java.net.MalformedURLException me) {
System.out.println("Malformed URL:" + me.toString());
} catch (RemoteException re) {
System.out.println("Remote exception:" + re.toString());
}
}
}
Project接口必須打成jar包,在client的包中進行引入。
package com.vs.myrmi;
import java.rmi.*;
import com.vs.rmi.Product;
public class RmiSampleClient {
public static void main(String[] args)
{
try {
String url = "//192.168.11.2:8808/SAMPLE-SERVER";
Product product = (Product)Naming.lookup(url);
System.out.println(product.getDescription());
} catch (RemoteException exc) {
System.out.println("Error in lookup: " + exc.toString());
} catch (java.net.MalformedURLException exc) {
System.out.println("Malformed URL: " + exc.toString());
} catch (java.rmi.NotBoundException exc) {
System.out.println("NotBound: " + exc.toString());
}
}
}
先執行server端進行監聽,然後執行client端,client執行的結果如下:
hello world, my rmi
java1.6中,已經不需要手動使用rmic命令生成骨架。