import java.rmi.Remote;
import java.rmi.RemoteException; public interface IService extends Remote { //聲明服務器端必須提供的服務 String service(String content) throws RemoteException; } |
import java.rmi.RemoteException;
//UnicastRemoteObject用於導出的遠程對象和獲得與該遠程對象通信的存根。 import java.rmi.server.UnicastRemoteObject; public class ServiceImpl extends UnicastRemoteObject implements IService { private String name; public ServiceImpl(String name) throws RemoteException { this.name = name; } @Override public String service(String content) { return "server >> " + content; } } |
/*
* Context接口表示一個命名上下文,它由一組名稱到對象的綁定組成。 * 它包含檢查和更新這些綁定的一些方法。 */ import javax.naming.Context; /* * InitialContext類是執行命名操作的初始上下文。 * 該初始上下文實現 Context 接口並提供解析名稱的起始點。 */ import javax.naming.InitialContext; public class Server { public static void main(String[] args) { try { //實例化實現了IService接口的遠程服務ServiceImpl對象 IService service02 = new ServiceImpl("service02"); //初始化命名空間 Context namingContext = new InitialContext(); //將名稱綁定到對象,即向命名空間註冊已經實例化的遠程服務對象 namingContext.rebind("rmi://localhost/service02", service02); } catch (Exception e) { e.printStackTrace(); } System.out.println("服務器向命名錶註冊了1個遠程服務對象!"); } } |
import javax.naming.Context;
import javax.naming.InitialContext; public class Client { public static void main(String[] args) { String url = "rmi://localhost/"; try { Context namingContext = new InitialContext(); // 檢索指定的對象。 即找到服務器端相對應的服務對象存根 IService service02 = (IService) namingContext.lookup(url + "service02"); Class stubClass = service02.getClass(); System.out.println(service02 + " 是 " + stubClass.getName() + " 的實例!"); // 獲得本底存根已實現的接口類型 Class[] interfaces = stubClass.getInterfaces(); for (Class c : interfaces) { System.out.println("存根類實現了 " + c.getName() + " 接口!"); } System.out.println(service02.service("你好!")); } catch (Exception e) { e.printStackTrace(); } } } |