壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1246|回复: 0

RMI学习记录

[复制链接]
发表于 2007/7/25 19:41:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 20:33 , Processed in 0.012160 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表