具体内容
3.1、分布式开发的基本概念
RMI可以从一台机器(在java中每一个JVM进程都表示一台机器),调用另一台机器上的程序,称为远程方法调用。
如果要想实现RMI,必须有一个远程方法的视图,此视图可以直接通过接口表示,但是此接口现在是属于远程接口。
服务器专门提供远程方法的具体实现,而客户端根据接口的定义从服务器端取得一个接口的实例,调用远程服务器上的方法。
所有服务器上提供的远程对象必须被RMI所注册,只有注册之后的对象才能被远程客户端所访问。
客户端通过名称找到服务器端上的远程对象,服务器端为每一个远程对象进行命名。
RMI程序中必须存在存根与骨架:
• 存根放在客户端
• 骨架放在服务器端
• 客户端通过存根找到服务器端的骨架,之后才可以完成RMI程序
• 在JDK 1.5之后程序不用再重新生成骨架了(此骨架程序将无法看见)
3.2、RMI程序开发
RMI程序中必须定义远程接口,必须编写远程接口实现类,必须有服务器,并且在服务器上注册远程对象。
3.2.1、定义远程接口
一个接口只要继承了java.rmi.Remote接口,此接口就称为远程接口。
在远程接口中的全部方法都将成为远程方法,远程方法必须抛出远程异常。
Hello.java:
package org.lxh.dao ;
import java.rmi.* ;
public interface Hello extends Remote{
public String sayHello(String name) throws RemoteException ;
}
3.2.2、定义远程接口实现类
远程接口的实现类除了要实现远程接口之外,还需要继承RemoteServer类,同时在构造方法中绑定此对象。
package org.lxh.dao.impl ;
import java.rmi.* ;
import java.rmi.server.* ;
import org.lxh.dao.* ;
public class HelloImpl extends RemoteServer implements Hello{
public HelloImpl() throws Exception{
UnicastRemoteObject.exportObject(this,1234) ;
}
public String sayHello(String name) throws RemoteException {
return "你好," + name ;
}
}
3.2.3、定义服务器端
服务器端的主要功能是绑定一个远程对象,通过名称服务绑定。
package org.lxh.server;
import java.rmi.* ;
import org.lxh.dao.* ;
import org.lxh.dao.impl.* ;
public class Server{
public static void main(String args[]){
try{
Hello he = new HelloImpl() ;
Naming.rebind("hello",he) ; // 绑定对象
}catch(Exception e){}
}
};
3.2.4、定义客户端
客户端主要就是查找远程对象,通过名称服务查找。
package org.lxh.client ;
import java.rmi.* ;
import org.lxh.dao.* ;
public class Client{
public static void main(String args[]){
Hello hello = null ;
try{
hello = (Hello)Naming.lookup("rmi://localhost/hello") ;
System.out.println(hello.sayHello("zhangsan")) ;
}catch(Exception e){}
}
};
3.2.5、RMI运行
RMI程序的运行有一系列的要求,因为最终必须有存根才可以让程序正常执行,而且还需要在RMI注册上绑定好对象。
1、 编译所有的程序:javac -d . *.java
2、 产生存根,在java的JDK中存在一个rmic的命令。可以根据远程接口的实现类生成存根:
rmic -d . org.lxh.dao.impl.HelloImpl
3、 启动RMI注册工具:rmiregistry
4、 打开新窗口,运行服务器端:java org.lxh.server.Server
5、 运行客户端:java org.lxh.client.Client
3.3、在web中访问RMI Server
从之前的程序可以发现,如果要想访问RMI服务器端,则必须有存根与远程接口,那么对于WEB端访问RMI端也是一样的,也必须存在存根及远程接口。
hello.jsp:
<%@page import="java.rmi.*"%>
<%@page import="org.lxh.dao.*"%>
<%
Hello hello = null ;
try{
hello = (Hello)Naming.lookup("rmi://localhost/hello") ;
}catch(Exception e){}
%>
<h1><%=hello.sayHello("zhangsan")%></h1>
现在的程序结构:
Client WEB RMI
• 对于客户端来说:WEB是服务器端
• 在服务器端来说:RMI又是服务器端,而WEB是客户端
• 服务器端和客户端的概念是相对而言的
4、总结
分布式开发中,最重要的就是接口,接口定义客户端与服务器端之间的访问标准。
3.1、分布式开发的基本概念
RMI可以从一台机器(在java中每一个JVM进程都表示一台机器),调用另一台机器上的程序,称为远程方法调用。
如果要想实现RMI,必须有一个远程方法的视图,此视图可以直接通过接口表示,但是此接口现在是属于远程接口。
服务器专门提供远程方法的具体实现,而客户端根据接口的定义从服务器端取得一个接口的实例,调用远程服务器上的方法。
所有服务器上提供的远程对象必须被RMI所注册,只有注册之后的对象才能被远程客户端所访问。
客户端通过名称找到服务器端上的远程对象,服务器端为每一个远程对象进行命名。
RMI程序中必须存在存根与骨架:
• 存根放在客户端
• 骨架放在服务器端
• 客户端通过存根找到服务器端的骨架,之后才可以完成RMI程序
• 在JDK 1.5之后程序不用再重新生成骨架了(此骨架程序将无法看见)
3.2、RMI程序开发
RMI程序中必须定义远程接口,必须编写远程接口实现类,必须有服务器,并且在服务器上注册远程对象。
3.2.1、定义远程接口
一个接口只要继承了java.rmi.Remote接口,此接口就称为远程接口。
在远程接口中的全部方法都将成为远程方法,远程方法必须抛出远程异常。
Hello.java:
package org.lxh.dao ;
import java.rmi.* ;
public interface Hello extends Remote{
public String sayHello(String name) throws RemoteException ;
}
3.2.2、定义远程接口实现类
远程接口的实现类除了要实现远程接口之外,还需要继承RemoteServer类,同时在构造方法中绑定此对象。
package org.lxh.dao.impl ;
import java.rmi.* ;
import java.rmi.server.* ;
import org.lxh.dao.* ;
public class HelloImpl extends RemoteServer implements Hello{
public HelloImpl() throws Exception{
UnicastRemoteObject.exportObject(this,1234) ;
}
public String sayHello(String name) throws RemoteException {
return "你好," + name ;
}
}
3.2.3、定义服务器端
服务器端的主要功能是绑定一个远程对象,通过名称服务绑定。
package org.lxh.server;
import java.rmi.* ;
import org.lxh.dao.* ;
import org.lxh.dao.impl.* ;
public class Server{
public static void main(String args[]){
try{
Hello he = new HelloImpl() ;
Naming.rebind("hello",he) ; // 绑定对象
}catch(Exception e){}
}
};
3.2.4、定义客户端
客户端主要就是查找远程对象,通过名称服务查找。
package org.lxh.client ;
import java.rmi.* ;
import org.lxh.dao.* ;
public class Client{
public static void main(String args[]){
Hello hello = null ;
try{
hello = (Hello)Naming.lookup("rmi://localhost/hello") ;
System.out.println(hello.sayHello("zhangsan")) ;
}catch(Exception e){}
}
};
3.2.5、RMI运行
RMI程序的运行有一系列的要求,因为最终必须有存根才可以让程序正常执行,而且还需要在RMI注册上绑定好对象。
1、 编译所有的程序:javac -d . *.java
2、 产生存根,在java的JDK中存在一个rmic的命令。可以根据远程接口的实现类生成存根:
rmic -d . org.lxh.dao.impl.HelloImpl
3、 启动RMI注册工具:rmiregistry
4、 打开新窗口,运行服务器端:java org.lxh.server.Server
5、 运行客户端:java org.lxh.client.Client
3.3、在web中访问RMI Server
从之前的程序可以发现,如果要想访问RMI服务器端,则必须有存根与远程接口,那么对于WEB端访问RMI端也是一样的,也必须存在存根及远程接口。
hello.jsp:
<%@page import="java.rmi.*"%>
<%@page import="org.lxh.dao.*"%>
<%
Hello hello = null ;
try{
hello = (Hello)Naming.lookup("rmi://localhost/hello") ;
}catch(Exception e){}
%>
<h1><%=hello.sayHello("zhangsan")%></h1>
现在的程序结构:
Client WEB RMI
• 对于客户端来说:WEB是服务器端
• 在服务器端来说:RMI又是服务器端,而WEB是客户端
• 服务器端和客户端的概念是相对而言的
4、总结
分布式开发中,最重要的就是接口,接口定义客户端与服务器端之间的访问标准。