JAVA简明摘要(十八)分布式计算(远程部署的RMI)

1 RMI

RMI(Remote MEthod Invocation)

远程过程调用的设计

服务器、客户端、服务器辅助设施、客户端辅助设施
1.创建客户端与服务器
2.创建客户端和服务器端的辅助设施。它们会处理所有客户端和服务器的低层网络输入\输出细节。
客户端辅助设施被称为stub
服务器端辅助设施被称为skeleton

协议

JRMP
JRMP是RMI原生的协议,它是为了Java对Java间的远程调用而设计的。
IIOP
IIOP是为了CORBA而产生的,能够调用Java对象或其他类型的远程方法。

2 创建远程服务

1.创建远程接口

(1)继承java.rmi.Remote
Remote是个标志性的接口,意味着没有方法,然而他对RMI有特殊的意义。
接口是可以继承其他的接口,所以创建出自己的接口继承Remote接口。

public interface MyRemote extends Remote {}

(2)声明所有的方法都会抛出RemoteException

import java.rmi.*;

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

(3)确保参数和返回值都是primitive主数据类型或Serializable

2.实现远程接口

(1)实现自己的远程接口,继承UnicastRemoteObject,实现与远程有关的功能。

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
  public String sayHello() {
    return "Server Say Hello To You!";
  }
}

(2)编写声明RemoteException的无参数构造函数,以处理UnicastRemoteObject的RemoteException。

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
  public String sayHello() {
    return "Server Say Hello To You!";
  }

  public MyRemoteImpl() throws RemoteException{}
}

(3)向RMI registry注册服务
初始化远程服务类并加进RMI registry(一定得运行起来,不然程序运行失败)。
当注册对象时,RMI系统会把stub加到registry中,因为这是客户端所需要的。
使用java.rmi.Naming的rebind()来注册服务。

try {
  MyRemote service = new MyRemoteImpl();
  Naming.rebind("Remote Hello", service);
} catch(Exception ex) {...}

3.产生stub和skeleton

对实现的类执行rmic

rmic MyRemoteImpl

4.执行rmiregitry

rmiregistry

5.启动服务

java MyRemoteImpl

完整代码

远程接口

import java.rmi.*;

public interface MyRemote extends Remote {
  public String sayHello() throws RemoteException;

远程服务

import java.rmi.*;
import java.rmi.server.*;

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {

  //无需声明RemoteException
  public String sayHello() {
    return "Server Say Hello To You!";
  }

  public MyRemoteImpl() throws RemoteException{}

  public static void main (String[] args) {
    try {
      MyRemote service = new MyRemoteImpl();
      Naming.rebind("Remote Hello", service);
    } catch(Exception ex) {ex.printStackTrace();}
  }
}

3 客户端取得stub

客户端必须要有接口类和stub类。

import java.rmi.*;

public class MyRemoteClient {

  public static void main (String[] args) {
    new MyRemoteClient().go();
  }

  public String go() {
      try {
        MyRemote service = (MyRemote) Naming.lookup("rmi://127.0.0.1/Remote/Remote Hello");
        String s = service.sayHello();
    } catch(Exception ex) {ex.printStackTrace();}
  }

}

4 servlet

servlet是放在HTTP Web服务器上运行的Java程序。
最常见的J2EE技术混合了servlet和EJB,前者是后者的用户。此时servlet是通过RMI来与EJB通信的。

JSP

JSP代表Java Server Pages。事实上服务器最终会把JSP转换为servlet。
servlet是让你写出带HTML输出的类,而JSP是让你写出带Java程序的网页。
servlet不需要处理动态的响应。

5 J2EE服务器

J2EE服务器包括了Web服务器和Enterprise JavaBeans(EJB)服务器。

6 Jini

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值