您的位置:首页 > 编程语言 > Java开发

Java 实现RMI入门程序

2016-04-20 10:56 447 查看
因为是Java内置的功能,所以不需要引入任何额外的Jar包

首先我们定义一个接口,这个接口必须继承Remote

package cn.blueboz.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
* Created by Administrator on 2016/4/20.
* 定义一个远程接口,这个远程接口务必实现Remote接口
*/
public interface IHelloRMI extends Remote {
/**
* 一个最简单的Hello实例
*/
public String sayHelloToClient()throws RemoteException;
}




接下来就是实现这个接口,注意,这个必须继承UnicastRemoteObject这个类
package cn.blueboz.rmi.impl;

import cn.blueboz.rmi.IHelloRMI;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
* Created by Administrator on 2016/4/20.
*/
public class HelloRMIImpl extends UnicastRemoteObject implements IHelloRMI{

/*i
* 这里必须是构造器抛出RemoteException
* 因为继承父类UnicastRemoteObject构造器中抛出RemoteException
* 同时这个类是必须继承UnicastRemoteObject这个类
*/
public HelloRMIImpl()throws RemoteException{
}
@Override
public String sayHelloToClient()throws RemoteException {
return "你好客户端,我是服务端";
}
}

接下来就是发布接口了

package cn.blueboz.rmi;

import cn.blueboz.rmi.impl.HelloRMIImpl;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

/**
* Created by Administrator on 2016/4/20.
*/
public class RMIServer {
/**
* 发布接口
* @param args
*/
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
/**
* 创建一个远程接口的实现类
*/
IHelloRMI helloRMI=new HelloRMIImpl();
/**
* 创建一个RMI端口,如果没有创建,RMI服务也就无法绑定到这个接口上面
*/
System.out.println("正在创建接口");
LocateRegistry.createRegistry(8889);
System.out.println("创建端口成功");
/**
* 在这里声明一下三个异常
* RemoteException:创建远程对象异常
* AlreadyBoundException:重复绑定异常
* MalformedURLException:指定的URI发生错误的异常
*/
System.out.println("正在绑定");
Naming.bind("rmi://localhost:8889/HelloRMI",helloRMI);
System.out.println("绑定成功!");
//注意,何以省略掉协议前缀,即使rmi:
        //Naming.bind("//localhost:8889/HelloRMI",helloRMI);
}
}

最后,我们可以看到


就说明我们的接口发布成功了,也可以使用终端内置工具netstat查看端口占用情况,发现存在8889端口,表示我们的端口发布成功



接下来就是测试我们的端口

新建另外的一个工程,从服务端赋值过来远程接口IHelloRemote,并且保持包路径不变

package cn.blueboz.rmiclient;

import cn.blueboz.rmi.IHelloRMI;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

/**
* Created by Administrator on 2016/4/20.
* Java RMI客户端
*/
public class RMIClient {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
/**
* IHelloRMI接口从服务端拷贝过来即可
* 这里必须注意的是IHelloRMI的包路径必须与服务端一致
* 如果不一致,会发生ClassNotFoundException
* Naming.lookup是在指定地址插在rmi服务
*/
IHelloRMI helloRMI = (IHelloRMI) Naming.lookup("rmi://localhost:8889/HelloRMI");
String s = helloRMI.sayHelloToClient();
System.out.println(s);
}
}

下面是测试结果



到这里JavaRMI的HelloWorld程序已经完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: