Java RMI(Remote Method Invocation)远程方法调用

RMI软件包的描述

RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。调用这样一个对象时,其参数为 "marshalled" 并将其从本地虚拟机发送到远程虚拟机(该远程虚拟机的参数为 "unmarshalled")上。该方法终止时,将编组来自远程机的结果并将结果发送到调用方的虚拟机。如果方法调用导致抛出异常,则该异常将指示给调用方。

RMI简单实现

1、客户端提供远程接口2、服务端拿到接口并实现接口里的所有方法3、在RMI注册表上注册服务端地址和远程接口对象4、客户端调用
声明:为了方便,本人的所有java文件都在同一文件夹内

定义远程访问接口

首先由客户端提供需要远程访问的接口,由服务端来实现,接口代码如下:

import java.rmi.Remote;

public interface IRMIface extends Remote {//继承远程对象Remote
	//由于继承了Remote,所以方法中要抛出RemoteException异常
	public long add(long a,long b) throws java.rmi.RemoteException;
}

服务端实现接口

接口实现代码如下:

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class RMIfaceImpl extends UnicastRemoteObject implements IRMIface {
	private static final long serialVersionUID = 1L;
	protected RMIfaceImpl() throws RemoteException{
		//这个构造方法不能少
		//网上有人说是因为继承了UnicastRemoteObject用来抛出异常用的
		//具体还未深入研究 
	}
	@Override
	public long add(long a, long b) throws RemoteException {
		return a+b;
	}
}

服务端注册接口

注册接口代码:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class RemoteBinding {
	public static void main(String[] args) {
		try{
			IRMIface myRemote = new RMIfaceImpl();
			System.out.println("=========start binding===========");
			LocateRegistry.createRegistry(8088);//注册端口
			Naming.rebind("rmi://localhost:8088/remoteRMI", myRemote);//绑定
			System.out.println("=========OK===========");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

编写客户端代码

import java.rmi.Naming;
public class MyRequest {
	public static void main(String [] args){  
		try{
			System.out.println("=========RMI remoteRMI===========");
			IRMIface myRemote = (IRMIface) Naming.lookup("rmi://localhost:8088/remoteRMI");
			System.out.println("=========RMI OK remoteRMI===========");
			long test = myRemote.add(10L, 20L);
			System.out.println(test);
		}catch(Exception e){  
			e.printStackTrace();  
		}  
	}  
}

测试运行

CMD打开命令窗口进入到java文件所在的文件夹,编译好所有的类(以下操作均在class文件的文件夹下)

第一步、用rmiregistry命令启动服务

第二步、新开一个窗口输入命令 java RemoteBinding 运行服务端绑定接口

第三步、再新开一个窗口输入命令 java MyRequest 运行客户端调用

注意:以上顺序不能换


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章