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)服务器。