`

Java 中RMI小应用

    博客分类:
  • Java
 
阅读更多

最近在学习序列化,看到远程调用也和序列化有关,于是顺便学学RMI,权当玩玩

1:所谓远程,并不需要分布在Internet上,或者在局域网中个,或者在同一台计算机的不同虚拟机之间,我们都可以称之为远程。EJB的实现也是以Java RMI为基础核心的。RMI远程方法调用,可以跨机器通过网络调用,不过Java RMI只支持两边都是Java程序,如果要实现完全两边异构,那么就要用到传说中的Web Service了。为了看好效果,都要建立两个或两个以上工程,当然,如果你有两个机器并通过局域网相连更好,如果能同有互联网的条件就更好了,以下是同一机器不同工程之间的小测试。

(1)首先建立一个服务端的工程,就叫RMIServerTest吧

(2)创建接口ServerInterface,继承Remote接口

 

package com.bona.rmi.server;

import java.rmi.Remote;
import java.rmi.RemoteException;  
  
/** 
* 定义远程接口,必须继承Remote接口, 
* 其中所有需要远程调用的方法都必须抛出RemoteException异常  
*/   
public interface HelloInterface extends Remote {   
    public String sayHello(String name) throws RemoteException;   
} 

 (3)创建接口的实现类 HelloInterfaceImpl,继承UnicastRemoteObject ,实现 HelloInterface 接口

 

 

package com.bona.rmi.server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloInterfaceImpl extends UnicastRemoteObject implements HelloInterface{  
  
    private static final long serialVersionUID = 1L;  
  
    public HelloImpl() throws RemoteException {  
        super();  
    }  
  
    @Override  
    public String sayHello(String name) throws RemoteException {  
        return "Hello, " + name;  
    }  
  
}  

 说明:接口的实现类同时要实现Serializable接口,这里继承UnicastRemoteObject也是间接实现Serializable接口,同时,因为构造方法需要抛出RemoteException,所以不能缺省使用隐含的无参构造方法,而应该自己显式定义构造方法。

 

(3)创建应用类,注册和启动服务端RMI,以被客户端调用

 

package com.bona.rmi.server;
import java.net.MalformedURLException;  
import java.rmi.AlreadyBoundException;  
import java.rmi.Naming;  
import java.rmi.RemoteException;  
import java.rmi.registry.LocateRegistry; 
public class HelloServer {  
    public static void main(String args[]) {  
        try {  
            //创建一个远程对象  
            HelloInterface rhello = new HelloInterfaceImpl();      
            //生成远程对象注册表Registry的实例,并指定端口为8888(默认端口是1099)  
            LocateRegistry.createRegistry(8888);  
  
            //把远程对象注册到RMI注册服务器上,并命名为RHello  
            //绑定的URL标准格式为:rmi://host:port/name(协议名可以省略,下面两种写法都可以)  
            Naming.bind("rmi://10.225.112.86:8888/HelloInterface", rhello);  
            //Naming.bind("//10.225.112.86:8888/HelloInterface",rhello);  
  
            System.out.println(">>INFO:远程HelloInterface对象绑定成功!");  
        } catch (RemoteException e) {  
            System.out.println("创建远程对象发生异常!");  
            e.printStackTrace();  
        } catch (AlreadyBoundException e) {  
            System.out.println("发生重复绑定对象异常!");  
            e.printStackTrace();  
        } catch (MalformedURLException e) {  
            System.out.println("发生URL畸形异常!");  
            e.printStackTrace();  
        }  
    }  
}  

运行HelloServer,看到

 

       >>INFO:远程HelloInterface对象绑定成功!

(4)新建一个新的工程,为了方便,也是Java Project,就叫RMIClientTest,

(5) 因为客户端需要有服务端那边提供的接口,才可以访问,所以要将服务端的HelloInterface接口完全拷贝(连同包)到客户端,当然为了方便,你在客户端工程中新建一个完全一样的接口也可以。实际运用中通常是要服务端接口打成jar包来提供的。

(6)创建客户端调用类

 

package com.bona.rmi.client;

import java.rmi.Naming;

import com.bona.rmi.server.HelloInterface;
public class HelloClient {  
    public static void main(String args[]) {  
        try {  
            // 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法  
            HelloInterface rhello = (HelloInterface) Naming.lookup("rmi://10.225.112.86:8888/HelloInterface");  
            System.out.println(rhello.sayHello("白哥"));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

 运行,显示成功

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics