分享
 
 
 

一个相当经典的RMI实例源代码及详细说明

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

RMI技术

下面以一个例子说明怎么使用RMI技术。这个例子演示了怎样将一个文件上传到服务器和怎样将一个文件从服务器上下载下来。

使用RMI技术共有6个步骤要走: (1)定义和实现远端接口中的参数 (2) 定义和实现远端接口 (3) 编写服务端代码 (4)编写客户端代码 (5)生成stub和skeltion ,并将stub打包到客户端jar中,将skeltion打包到服务端jar中 (6)启动rmiregistry , 并将服务注册到rmiregistry中,然后运行代码。下面就这六个方面说明rmi技术。

定义和实现远端接口中的参数

(1)定义远端接口中的参数

每一个远端接口中的参数都必须是可序列化的。那么,如何定义一个序列化的接口呢,简单,只需从Java.io.Serializable继续即可,如下所示:

import java.io.Serializable;

public interface FileInformation extends Serializable {

StringgetName();

byte[]getContent();

voidsetInformation(String name , byte[] content);

};

(2)实现远端接口中的参数。

实现远端接口中的参数的接口跟与实现其他任何接口没什么不一样的地方,如下所示

public class FileInformationSev implements FileInformation {

private String name = null ;

private byte[] content = null ;

public String getName() {

return name ;

}

public byte[] getContent() {

return content;

}

public void setInformation(String name, byte[] content) {

this.name = name ;

this.content = content ;

}

}

那么,为什么要序列化远端接口中的参数(返回值) ?这是因为需要将客户端的对象(参数)转化成byte stream,通过网络协议传输到服务端,再还原成服务端的对象进行调用。或者是需要将服务端的对象(返回值)转化成byte stream,通过网络协议传输到服务端,再还原成客户端的对象进行调用。

在 jdk中, java.lang包和java.util包下的类都已经实现了序列化,直接可以用在远程接口中作参数或返回值;所有的基本类型也可以直接用在远程接口中作参数或返回值;

定义和实现远端接口

(1)定义远端接口

远端接口必须从java.rmi.Remote继续;远端接口中的方法假如要throw异常,这个异常必须是java.rmi.RemoteException(或java.rmi.RemoteException的子类),否则,这个异常就不能被返回到客户端。Example如下:

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface LoadFile extends Remote {

void upLoadFile(FileInformationfileInof) throws RemoteException;

FileInformation downLoadFile(String filename) throws RemoteException ;

}

(2)实现远端接口

实现远端接口比较轻易,跟其他接口的实现没有什么区别,如下所示:

import java.rmi.Remote;

import java.rmi.RemoteException;

import java.io.IOException;

import java.io.File;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.rmi.server.UnicastRemoteObject;

public class LoadFileService extends UnicastRemoteObjectimplements LoadFile {

private StringcurrentDir= null ;

// this contrUCtion is needed

public LoadFileService() throws RemoteException {

super();

}

publicvoidsetCurrentDir(String currentDir){

this.currentDir = currentDir ;

}

public void upLoadFile(FileInformationfileInfo) throws RemoteException{

BufferedOutputStream output = null ;

try{

// check paramter

if(fileInfo == null ){

throw new RemoteException("the paramter is null ");

}

//check fileName and content

String fileName = fileInfo.getName() ;

byte [] content = fileInfo.getContent() ;

if(fileName == null content == null ){

throw new RemoteException("the file or the contentis null ");

}

//create file

String filePath = this.currentDir + "\\" + fileName ;

File file = new File(filePath);

if(!file.exists()){

file.createNewFile();

}

//save the content to the file

output = new BufferedOutputStream(new FileOutputStream(file));

output.write(content);

}catch(RemoteException ex){

throw ex ;

}catch(Exception ex){

throw new RemoteException(ex.getLocalizedMessage());

}finally{

if(output != null ){

try{

output.close();

output = null ;

}catch(Exception ex){

}

}

}

}

public FileInformation downLoadFile(String fileName) throws RemoteException {

FileInformation fileInfo = null ;

BufferedInputStream input = null ;

try{

// check paramter

if(fileName == null){

throw new RemoteException("the paramter is null ");

}

// get path

String filePath = this.currentDir + "\\" + fileName ;

File file = new File(filePath);

if(!file.exists()){

throw new RemoteException("the file whose name is " + fileName + " not existed ");

}

// get content

byte[] content = new byte[(int)file.length()];

input = new BufferedInputStream(new FileInputStream(file));

input.read(content);

// set file name and content to fileInfo

fileInfo = new FileInformationSev();

fileInfo.setInformation(fileName , content);

}catch(RemoteException ex){

throw ex ;

}catch(Exception ex){

throw new RemoteException(ex.getLocalizedMessage());

}finally{

if(input != null ){

try{

input.close();

input = null ;

}catch(Exception ex){

}

}

}

return fileInfo ;

}

}

编写服务端代码

服务端代码主要有3个步骤:

(1)加载安全治理器

(2)创建一个服务对象

(3)将这个服务对象注册到命名服务上

import java.rmi.RMISecurityManager;

import java.rmi.Naming;

public class RMIServer {

public static void main(String[] args) {

try{

//加载安全治理器

System.setSecurityManager(new RMISecurityManager() );

//创建一个服务对象

LoadFileServiceserver = new LoadFileService();

server.setCurrentDir("c:\\rmiexample");

//将服务对象注册到rmi注册服务器上,而不是其他服务器

//(因为LoadFileService extends UnicastRemoteObject)

Naming.rebind("//127.0.0.1:2000/LoadFileServer", server);

}catch(Exception ex){

System.out.println(ex.getLocalizedMessage());

ex.printStackTrace();

}

}

}

注重:将对象注册以后,不可关闭服务对象。

编写客户端代码

客户端代码需要两个步骤:

(1)根据服务的名称,查找服务对象

(2)调用服务服务对象对应的方法完成工作

在这个例子中,我们从客户端上传一个文件到服务器,并将服务器的一个文件下载下来。

代码如下:

import java.io.IOExcep

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有