java.rmi下载_RMI:关于RMI文件上传下载的完整例子

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 {

String  getName();

byte[]  getContent();

void    setInformation(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(FileInformation  fileInof) 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 UnicastRemoteObject  implements LoadFile {

private String  currentDir= null ;

// this contruction is needed

public LoadFileService() throws RemoteException {

super();

}

public  void  setCurrentDir(String currentDir){

this.currentDir = currentDir ;

}

public void upLoadFile(FileInformation  fileInfo) 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 content  is 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 ;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值