|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622 。
您需要 登录 才可以下载或查看,没有帐号?注册
x
候捷先生一直鼓励平时学习过程中要勤作记录,深有同感。看过的知识重炒冷饭实在是无趣,因此今日狠下决心,从今天的RMI开始。第一次未免记得比较乱,抓不得要领,看来这也不是一件容易的事。
///////////////////////////////////////////////////////////////////////////////////////
RMI
///////////////////////////////////////////////////////////////////////
由5个包及3个应用工具组成
java.rmi 组织客户端的RMI类、接口和异常
java.rmi.server 组织服务器端的RMI类 接口和异常
java.rmi.registry 组织用于管理RMI命名服务的类
java.rmi.dgc 组织用于管理分布式垃圾收集的类
java.rmi.activation 组织用于实现按需激活的RMI服务的类
rmic 编译器,它产生RMI使用的存根和框架以完成分布式通信
rmiregistry 一个为RMI提供命名服务的服务器,这项服务把名字和对象关联在一起
rmid 一个支持RMI激活框架的服务器
////////////////////////////////////////////////////////////////////////////
客户端RMI
创建一个RMI客户端两个步骤: 1 连接到服务器 2 处理有关异常
JAVA中由SecurityManager来控制网络的连接
设置安全管理器
System.setSecurityManager(new RMISecurityManager());
可通过修改JDK默认属性 或策略文件来提供权限
设置java.security.poicy属性来启用自定义安全策略 它可以作为Java解释器的一个标志来设置 如
java -Djava.security.policy=server.policy server.Server
/////////////////////////////////////////////////////////////////////////////
服务器RMI
服务器也使用RMISecurityManager
创建服务端三个步骤:
1 实现远程接口
通过定义一个扩展java.rmi.server.RemoteObject类的对象来完成
目前建议初始服务器扩展一个RemoteObject的子类 UnicastRemoteObject和Activatable 等。
RemoteServer有静态方法:
public static String getClientHost() throws ServerNotActiveException;
public static void setLog(OutputStream out)
public static PrintStream getLog()
将一个对象与一个网络连接相关联的过程叫做导出(exporting) 程序能够不需要UnicastRemoteObject的子类手动导出对象
导出一个对象最简单的方法如下
public static RemoteStub exportObject(Remote obj) throws RemoteException
服务器系统属性中最重要的是 java.rmi.server.codebase 标明code base 的URL,从这里为网络客户加载类
当我们想发送一个对象给客户机,而这个对象类没有包含在客户机的classpath中时,必须要设置。
2 服务器需要初始化RMI库
3 注册服务器,使他能被客户机访问
///////////////////////////////////////////////////////////////////////////////
连接客户机和服务器
启动rmiregistry服务
可以通过java.rmi.Naming类来定位一个注册表 其中所有的方法都是静态的 不需要创建类即可使用
常用方法:
lookup(String name)
bind(String name, Remote obj)
unbind(String name)
rebind(String name, Remote obj)
list(String name)
可以使用rmi.registry.LocateRegistry的createRegistry(int port)来创建私有注册表
////////////////////////////////////////////////////////////////////////////////
创建一个RMI应用
1 创建并编译一个扩展了java.rmi.Remote的远程对象接口
2 实现一个服务器应用,它包含一个实现该接口的远程对象类
3 编译服务器应用,运行rmic以产生必要的存根类
4 在已知的位置安装类文件,比如web服务器的classes目录。事实上,RMI不需要WEB服务器。但是,
对于在不同机器上的应用之间共享类,这是更好的机制
5 在服务器上运行rmiregistry使之能够管理远程对象
6 运行服务器应用,在注册表中安装一个使用唯一名字的远程对象的实例
7 实现一个客户应用,连接到服务器并通过名字在一个注册表中查找远程对象
8 编译客户端应用
9 运行客户机
/////////////////////////////////////////////////////////////////////////////////
简单的客户机/服务器应用
////////////////////////////////////
远程接口
package message;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MessageServer extends Remote
{
static String SERVER_NAME = \"Message_Server\";
void send(String name, String message) throws RemoteException;
}
////////////////////////////////////////////
服务器实现
package server;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import message.*;
public class Server extends UnicastRemoteObject implements MessageServer
{
public Server() throws RemoteException
{
super();
}
public void send(String name, String message) throws RemoteException
{
System.out.println(name + \": \" + message);
}
public static void main(String[] args)
{
//System.setSecurityManager(new RMISecurityManager());
try
{
MessageServer srv = new Server();
Naming.rebind(MessageServer.SERVER_NAME, srv);
System.out.println(\"Server bound and started\");
} catch (Exception e)
{
System.out.println(\"Exception :\" + e);
}
}
}
//////////////////////////////////////////////////////////
编译安装服务器
javac server.Server
rmic server.Server
start rmiregistry
start java -Djava.security.manager
-Djava.security.policy=server.policy server.Server
////////////////////////////////////////////////////////
客户机的实现
package client;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import message.*;
public class Client
{
static String name;
static MessageServer server;
public static void main(String[] args)
{
if (args.length < 1)
{
System.out.println(\"Uasge: java client.Client ClientName\");
System.exit(-1);
}
name = args[0];
/*name = \" P\";*/
//System.setSecurityManager(new RMISecurityManager());
try
{
server = (MessageServer)Naming.lookup(MessageServer.SERVER_NAME);
boolean notDone = true;
String message = null;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println(\"Type 磂xit |
|