远程接口
-
远程接口必须声明为public
-
远程接口必须继承java.rmi.Remote
-
远程接口中的方法必须将java.rmi.RemoteException声明于其throws子句中
-
作为参数或者返回值的远程对象,必须声明为其对应的远程接口,而不是实际的实现类
-
Example
package com.sk.RMI;
import java.rmi.Remote;
import java.rmi.RemoteException;
/**
* 远程接口必须声明为public,并且必须继承java.rmi.Remote类
*/
public interface RMIQueryStatus extends Remote
{
/**
* 远程接口函数必须将RemoteException声明其throws子句内
* @param fileName
* @return
* @throws RemoteException
*/
RMIFileStatus getFileStatus(String fileName) throws RemoteException;
}
远程对象类
package com.sk.RMI;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/**
* 远程对象类;
* 远程对象类继承UnicastRemoteObject类,实现RMIQueryStatus接口
*/
public class RMIQueryStatusImpl extends UnicastRemoteObject implements RMIQueryStatus
{
@Override
public RMIFileStatus getFileStatus(String fileName) throws RemoteException
{
RMIFileStatus status = new RMIFileStatus(fileName);
return null;
}
}
RMI远端对象注册点获得本地存根对象
package com.sk.RMI;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
/**
* (1)RMI服务器创建院层对象类的对象,将对象绑定到注册服务上面
* (2)RMI客户程序则通过注册点,利用名字查找远程对象,并构造出响应的本地存根对象。
* (3)RMI客户程序就可以调用远程方法了
*
*/
public class RMIQueryStatusServer
{
public static void main(String[] args)
{
try
{
//创建远程对象类实例
RMIQueryStatusImpl queryService = new RMIQueryStatusImpl();
LocateRegistry.createRegistry(12090);
//绑定远端对象到名字
Naming.bind(RMI_URL,queryService);
System.out.println("servy ready");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
客户端程序获取远程引用
package com.sk.RMI;
import java.rmi.Naming;
/**
*
*/
public class RMIQueryStatusClient
{
public static void main(String[] args)
{
try
{
//创建远程接口的实例对象
RMIQueryStatus query = (RMIQueryStatus) Naming.lookup(RMIQueryStatusServer.RMI_URL);
//调用远程方法如同调用本地方法
RMIFileStatus status = query.getFileStatus("/tmp/RMI");
System.out.println(status);
}
catch (Exception e)
{
//远程方法和普通方法的一个差别:远程方法可能会抛出RemoteException异常
e.printStackTrace();
}
}
}