RMI使用

搭建一个RMI服务的过程分为以下7步;

1,创建远程方法接口,该接口必须继承自Remote接口

Remote 接口是一个标识接口,用于标识所包含的方法可以从非本地虚拟机上调用的接口,Remote接口本身不包含任何方法

package server;

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

public interface Hello extends Remote {
	public String sayHello(String name) throws RemoteException;
}

 由于远程方法调用的本质依然是网络通信,只不过隐藏了底层实现,网络通信是经常会出现异常的,所以接口的所有方法都必须抛出RemoteException以说明该方法是有风险的

2,创建远程方法接口实现类:

UnicastRemoteObject类的构造函数抛出了RemoteException,故其继承类不能使用默认构造函数,继承类的构造函数必须也抛出RemoteException

由于方法参数返回值最终都将在网络上传输,故必须是可序列化的

package server;

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

public class HelloImpl extends UnicastRemoteObject implements Hello {
	private static final long serialVersionUID = -271947229644133464L;

	public HelloImpl() throws RemoteException{
		super();
	}

	public String sayHello(String name) throws RemoteException {
		return "Hello,"+name;
	}
}

4,启动RMI注册服务

LocateRegistry.createRegistry(12312); 

 5,编写服务端代码

package server;

import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;

public class HelloServer {
	public static void main(String[] args) {
		try{
			Hello h = new HelloImpl();
			
			//创建并导出接受指定port请求的本地主机上的Registry实例。
			//LocateRegistry.createRegistry(12312);
			
			/**	Naming 类提供在对象注册表中存储和获得远程对远程对象引用的方法
			 *  Naming 类的每个方法都可将某个名称作为其一个参数,
			 *  该名称是使用以下形式的 URL 格式(没有 scheme 组件)的 java.lang.String:
			 *  //host:port/name
			 *  host:注册表所在的主机(远程或本地),省略则默认为本地主机
			 *  port:是注册表接受调用的端口号,省略则默认为1099,RMI注册表registry使用的著名端口
			 *  name:是未经注册表解释的简单字符串
			 */
			//Naming.bind("//host:port/name", h);
			Naming.bind("rmi://192.168.58.164:12312/Hello", h);
			System.out.println("HelloServer启动成功");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

 先创建注册表,然后才能在注册表中存储远程对象信息

7,编写客户端代码

    package client;  
      
    import java.net.MalformedURLException;  
    import java.rmi.Naming;  
    import java.rmi.NotBoundException;  
    import java.rmi.RemoteException;  
      
    import server.Hello;  
      
    public class HelloClient {  
        public static void main(String[] args) {  
            try {  
                Hello h = (Hello)Naming.lookup("rmi://192.168.58.164:12312/Hello");  
                System.out.println(h.sayHello("zx"));  
            } catch (MalformedURLException e) {  
                System.out.println("url格式异常");  
            } catch (RemoteException e) {  
                System.out.println("创建对象异常");  
                e.printStackTrace();  
            } catch (NotBoundException e) {  
                System.out.println("对象未绑定");  
            }  
        }  
    }  

猜你喜欢

转载自liuna718-163-com.iteye.com/blog/2411893
Rmi
今日推荐