---恢复内容开始---
RMI已经不是什么新的技术了,但是相对于webservice来说,rmi比较简单,比较适合一些小的应用,下面的helloword列子可以介绍rmi的相关技术
服务器端代码:
服务器接口实现Remote
1 package com.qcf.server; 2 3 import java.rmi.Remote; 4 import java.rmi.RemoteException; 5 /** 6 * 服务类 7 * 定义行为集 8 * @author Administrator 9 * 10 */ 11 public interface IHello extends Remote { 12 13 //在服务器端打印客户端传过来的字符串并返回该字符串 14 public String sayHello(String str) throws RemoteException; 15 }
接口的实现类
1 package com.qcf.server; 2 3 import java.rmi.RemoteException; 4 import java.rmi.server.UnicastRemoteObject; 5 6 /** 7 * 服务器端实现类 8 * 需要继承UnicastRemoteObject 9 * @author Administrator 10 * 11 */ 12 public class IHelloImpl extends UnicastRemoteObject implements IHello{ 13 14 //必须的 15 protected IHelloImpl() throws RemoteException { 16 super(); 17 } 18 19 @Override 20 public String sayHello(String str) throws RemoteException { 21 System.out.println("客户端传过来的字符串是:" + str); 22 return str; 23 } 24 25 }
服务类启动服务类
1 package com.qcf.server; 2 3 import java.net.MalformedURLException; 4 import java.rmi.AlreadyBoundException; 5 import java.rmi.Naming; 6 import java.rmi.RemoteException; 7 import java.rmi.registry.LocateRegistry; 8 9 /** 10 * RMI服务器 11 * 1、创建一个服务 12 * 2、启动服务器 13 * 3、注册服务 14 * @author Administrator 15 * 16 */ 17 public class HelloServer { 18 19 public static void main(String[] args) throws RemoteException, MalformedURLException, AlreadyBoundException { 20 //1、创建一个服务 21 IHello iHello=new IHelloImpl(); 22 //2、启动服务器 启动一个注册表并把注册表绑定到一个端口(默认端口1099) 23 LocateRegistry.createRegistry(8189); 24 25 //3将服务注册到注册表 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) 26 Naming.bind("rmi://localhost:8189/ihello", iHello); 27 System.out.println("server start success!"); 28 } 29 }
客户端类
创建接口类如上
客户端测试类
1 package com.qcf.client; 2 3 import java.net.MalformedURLException; 4 import java.rmi.Naming; 5 import java.rmi.NotBoundException; 6 import java.rmi.RemoteException; 7 8 /** 9 * 客户端测试类 10 * 服务器是谁 服务器 11 * 如何获取服务 查找 12 * 调用接口 13 * @author Administrator 14 * 15 */ 16 public class HelloClient { 17 public static void main(String[] args) throws Exception, Exception, Exception { 18 //查找服务 19 IHello hello=(IHello) Naming.lookup("rmi://localhost:8489/ihello"); 20 //调用接口 21 String str=hello.sayHello("哈哈哈 。我测试成功了"); 22 System.out.println("客户端"+str); 23 } 24 }
运行RMI服务端程序:
![](http://img1.51cto.com/attachment/200808/200808071218121453750.png)
运行RMI客户端程序:
总结:
从上面的过程来看,RMI对服务器的IP地址和端口依赖很紧密,但是在开发的时候不知道将来的服务器IP和端口如何,但是客户端程序依赖这个IP和端口。
这也是RMI的局限性之一。这个问题有两种解决途径:一是通过DNS来解决,二是通过封装将IP暴露到程序代码之外。
RMI的局限性之二是RMI是Java语言的远程调用,两端的程序语言必须是Java实现,对于不同语言间的通讯可以考虑用Web Service或者公用对象请求代理体系(CORBA)来实现。
---恢复内容结束---