package com.zwt.com.RMI;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
/***
* Hello的服务器
*
* @author wentaozhang
*/
public class HelloServer {
public static void main(String[] args) {
try {
IHello Rhello = new HelloImpl();
// 本地注册端口号为8888,这一步的关键是把对象绑定到远程注册表中去
//相当于完成一个端口,给一个端口存储可供调用的对象--具体的按照接口去
LocateRegistry.createRegistry(8888);
// 完成ip与端口号的绑定
Naming.bind("rmi://localhost:8888/RHello", Rhello);
System.out.println("端口号绑定成功,服务器开启成功");
} catch (RemoteException e) {
System.out.println("创建远程对象失败");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生url地址畸形");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定的错误");
e.printStackTrace();
}
}
}
1.首先RMI的概念
Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。
2.RMI的大致的流程
2.1服务器设置
我的理解是 设置远程的服务器中注册一个注册表,首先完成一个端口,表示为一个仓库,用于存储拥有方法实现的对象
具体的代码如下:
IHello Rhello =
new
HelloImpl();
---完成对象的实例化
// 本地注册端口号为8888,这一步的关键是把对象绑定到远程注册表中去
//相当于完成一个端口,给一个端口存储可供调用的对象--具体的按照接口去
LocateRegistry. createRegistry(8888);
---------完成本地服务器的注册
Naming.bind(
"rmi://localhost:8888/RHello"
, Rhello);
---------完成注册表的绑定--这个部分可以选择看源码
源码中的实现,服务器中是利用TCP,完成网络数据的交互--具体的实现要看源码-这边就不详细的说明了
关键在于Naming这个类中,很好的完成了各种方法的封装~例如根据url,找到主机和端口,使用HashTable存储功能对象
2.1客户端设置
//使用Naming这个封装完成寻址,找端口
IHello hello= (IHello) Naming.lookup(
"rmi://localhost:8888/RHello"
);
这个部分的写法是完成,寻址,分析传来的url,port,功能对象
具体的实现是利用TCP完成数据信息的传递,最后生成一个代理类,完成功能代码的实现