Posted on 2009-07-15 21:51
eric_xu 阅读(225)
评论(0) 编辑 收藏 所属分类:
Java
CORBA与SOAP都是完全独立于语言的。CORBA的接口定于语言是IDL,SOAP是WSDL。
远程方法调用
存根:
1.
被使用的远程对象的标识符;
2.
被调用的方法的描述;
3.
编组后的参数。
服务端接受对象:
1.
反编组参数;
2.
定位要调用的对象;
3.
调用所需方法;
4.
捕获返回值或该调用产生的异常,并对它编组;
5.
将返回值编组,打包送给客户端存根。
远程对象的所有接口都必须继承Remote接口,java.rmi.remote。接口中的所有方法也必须抛出RemoteException异常。
基本的RMI类
服务器类通常继承自java.rmi.server.RemoteServer类。RemoteServer是一个抽象类,仅仅定义了服务器对象与其远程存根之间通信的基本机制。UnicastRemoteServer是一个实体类,继承自RemoteServer。
服务器程序使用自举注册服务来注册对象,然后客户端可以获取这些对象的存根。
// server
ProductImpl p1 = new ProductImpl("Blackwell Toaster");
Context namingContext = new InitialContext();//建立一个命名context来访问RMI注册表
namingContext.bind("rmi:toaster", p1);//将rmi:toaster与p1对象绑定。
// client
Product p = (Product) namingContext.lookup("rmi://yourserver.com/toaster");//返回url对应的远程对象。
默认情况下,服务器是localhost,端口为1099。
可获得所有URL中带有rmi:的服务器对象的列表。
NamingEnumeration<NameClassPair> e = namingContext.list("rmi:");
只要实现Serializable接口的类都可以被复制。
远程对象是作为存根通过网络传递的,而非远程对象是通过复制。