所谓分布式,就是一个系统的多个服务在不同的域上。
我们都知道实现分布式系统之间的通信包括基于消息的系统间通信,即tcp/ip,udp/ip的socket通信,还有rmi和websercie的方式。
今天学习了一下rmi,并做了一个小例子
过程如下:
1.首先创建远程服务器端的接口以及实现类。
package jdevelloper.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
//接口要实现Remote接口,并且接口中的方法也要抛出RemoteException
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
2.编写接口对应的实现类
package jdevelloper.rmi;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImp extends UnicastRemoteObject implements Hello {
private static final long serialVersionUID = 1L;
protected HelloImp() throws RemoteException {
super();
}
public String sayHello() throws RemoteException {
return "Hello word";
}
public static void main(String[] args) {
if(System.getSecurityManager()==null){
System.setSecurityManager(new SecurityManager());
}
try{
Hello obj = new HelloImp();
//使用RMI注册机注册对象
Naming.bind("HelloServer",obj);
System.out.println("HelloServer bound in registry");
}catch(Exception e){
e.printStackTrace();
}
}
}
//注:main方法中主要就是完成将服务器对象注册的RMI注册机中,可以提出来方法其他的类中
3.进入DOS编译以上两个文件
当我在dos中敲java的时候发现不识别该命令,这个原因是由于没有在高级环境变量中配置java bin的根目录导致的。
配置后重新启动机器,可以识别java命令
首先进入文件所在目录
f:
cd F:\worklearning\RMI\src\jdevelloper\rmi
javac -d . *.java
//javac -d表示把编译后的java文件按照包接口放到指定的目录下,这里使用.表示的是当前的目录.
进行rmi反编译以生产stub文件
rmic jdevelloper.rmi.HelloImp
//rmic是java中用于让远程对象生成stub和skeleton,所谓远程对象就是指实现remote接口的类
成功生成HelloImp_Stub.class文件后创建安全策略
在命令窗口中输入policytool
再弹出的窗口中选择添加规则项目-添加权限-选择全部权限,然后将文件保存到C:\Documents and Settings\Administrator路径下,保存名称为.java.policy。
启动rmi注册机
start rmiregistry
运行服务器端
java jdevelloper.rmi.HelloImp
抛出拒绝soctet访问的异常,于是我进入
C:\java1.6\jre\lib\security目录下,修改java.policy文件,在grant里添加
permission java.security.AllPermission;
permission java.util.PropertyPermission "file.encoding", "read";
命令
第二句的意思是让程序能读取二进制文件,否则会抛出拒绝读取二进制文件的异常
再次运行服务器脚本成功
然后创建客户端
package jdevelloper.rmi;
import java.rmi.Naming;
public class HelloClient {
public static void main(String[] args) throws Exception {
System.setSecurityManager(new SecurityManager());
Hello RemoteObj = (Hello)Naming.lookup("//localhost/HelloServer");
String message = RemoteObj.sayHello();
System.out.println(message);
}
}
重新打开一个DOS窗口,编译并运行
服务器端返回hello word
我们都知道实现分布式系统之间的通信包括基于消息的系统间通信,即tcp/ip,udp/ip的socket通信,还有rmi和websercie的方式。
今天学习了一下rmi,并做了一个小例子
过程如下:
1.首先创建远程服务器端的接口以及实现类。
package jdevelloper.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
//接口要实现Remote接口,并且接口中的方法也要抛出RemoteException
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
2.编写接口对应的实现类
package jdevelloper.rmi;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloImp extends UnicastRemoteObject implements Hello {
private static final long serialVersionUID = 1L;
protected HelloImp() throws RemoteException {
super();
}
public String sayHello() throws RemoteException {
return "Hello word";
}
public static void main(String[] args) {
if(System.getSecurityManager()==null){
System.setSecurityManager(new SecurityManager());
}
try{
Hello obj = new HelloImp();
//使用RMI注册机注册对象
Naming.bind("HelloServer",obj);
System.out.println("HelloServer bound in registry");
}catch(Exception e){
e.printStackTrace();
}
}
}
//注:main方法中主要就是完成将服务器对象注册的RMI注册机中,可以提出来方法其他的类中
3.进入DOS编译以上两个文件
当我在dos中敲java的时候发现不识别该命令,这个原因是由于没有在高级环境变量中配置java bin的根目录导致的。
配置后重新启动机器,可以识别java命令
首先进入文件所在目录
f:
cd F:\worklearning\RMI\src\jdevelloper\rmi
javac -d . *.java
//javac -d表示把编译后的java文件按照包接口放到指定的目录下,这里使用.表示的是当前的目录.
进行rmi反编译以生产stub文件
rmic jdevelloper.rmi.HelloImp
//rmic是java中用于让远程对象生成stub和skeleton,所谓远程对象就是指实现remote接口的类
成功生成HelloImp_Stub.class文件后创建安全策略
在命令窗口中输入policytool
再弹出的窗口中选择添加规则项目-添加权限-选择全部权限,然后将文件保存到C:\Documents and Settings\Administrator路径下,保存名称为.java.policy。
启动rmi注册机
start rmiregistry
运行服务器端
java jdevelloper.rmi.HelloImp
抛出拒绝soctet访问的异常,于是我进入
C:\java1.6\jre\lib\security目录下,修改java.policy文件,在grant里添加
permission java.security.AllPermission;
permission java.util.PropertyPermission "file.encoding", "read";
命令
第二句的意思是让程序能读取二进制文件,否则会抛出拒绝读取二进制文件的异常
再次运行服务器脚本成功
然后创建客户端
package jdevelloper.rmi;
import java.rmi.Naming;
public class HelloClient {
public static void main(String[] args) throws Exception {
System.setSecurityManager(new SecurityManager());
Hello RemoteObj = (Hello)Naming.lookup("//localhost/HelloServer");
String message = RemoteObj.sayHello();
System.out.println(message);
}
}
重新打开一个DOS窗口,编译并运行
服务器端返回hello word