RMI 를 통 해 UNIX 시스템 의 파일 을 다운로드 합 니 다.

[size = large] [b] 서버 쪽: [/b] [/size]
1. 원 격 통신 의 인터페이스 와 인터페이스 와 관련 된 종 류 를 정의 합 니 다 (여 기 는 Remote FileInfo. 자바 만 있 습 니 다).이 인 터 페 이 스 는 인터페이스 Remote 를 계승 해 야 하 며, 그 안의 방법 은 모두 Remote Exception 이상 을 던 져 야 한다.
[size=medium]FileManager.java[/size]

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface FileManager extends Remote {

/**
* 从远程服务器获取文件信息
*
* @param path
* @param fileName
* @return
* @throws RemoteException
*/
public RemoteFileInfo getRemoteFile(String path, String fileName)
throws RemoteException;

}

[size=medium]RemoteFileInfo.java[/size]
import java.io.Serializable;
import java.util.List;

/**
* 文件实体类
*/
public class RemoteFileInfo implements Serializable{
private String fileName; // 文件名
// private byte[] content;
private List content; // 文件内容 (每1024个字节的内容作为列表的一个元素)


public RemoteFileInfo(String fileName, List content) {
this.fileName = fileName;
this.content = content;
}


public List getContent() {
return content;
}

public void setContent(List content) {
this.content = content;
}


public String getFileName() {
return fileName;
}

public void setFileName(String fileName) {
this.fileName = fileName;
}

}

2. 인 터 페 이 스 를 실현 하고 RMI 규범 에 따라 인터페이스 구현 클래스 의 이름 은 '인터페이스 파일 이름 + Impl. java' 로 명명 해 야 한다.이 는 원 격 인터페이스 뿐만 아니 라 유 니 캐 스 트 RemoteObject 류 를 계승 하여 구조 함수 (구조 함수 도 RemoteException 이상 을 던 져 야 합 니 다) 를 설명 합 니 다.
[size=medium]FileManagerImpl.java[/size]
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* 文件操作实现类
*/
public class FileManagerImpl extends UnicastRemoteObject implements FileManager {
private static final Log log = LogFactory.getLog(FileManagerImpl.class);

public FileManagerImpl() throws RemoteException {
super();
}

public RemoteFileInfo getRemoteFile(String path, String fileName)
throws RemoteException {
try {
RemoteFileInfo remoteFile;
List content = new ArrayList();
File file = new File(path + fileName);
BufferedInputStream in = new BufferedInputStream(
new FileInputStream(file));

// 处理大文件时,每次读取1024个字节存到centent对象
byte[] bufContent = new byte[1024];
while(in.read(bufContent) !=-1){
content.add(bufContent);
bufContent = new byte[1024];
}

/*
// 只能用到内容少的文件,遇到大文件会出现内容溢出错误
byte[] content = new byte[(int)file.length()];

in.read(content);
*/
remoteFile = new RemoteFileInfo(fileName,content);
log.info("Getting ["+fileName+"] is successful");

return remoteFile;
} catch (IOException e) {
log.error("Failed to get ["+fileName+"] ...");
e.printStackTrace();
return null;
}
}

3. Stub 클래스 를 생 성 합 니 다 (JDK 5.0 이상 이면 이 단 계 를 무시 할 수 있 습 니 다). 이 단 계 를 수행 할 때 구현 클래스 의 class 파일 을 먼저 생 성 합 니 다.
javac 명령 을 사용 하여. class 파일 을 생 성 합 니 다.(예: Unix 아래: javac - classpath.:./lib/commons - logging. jar:
./lib/log4j-1.2.15.jar package1/package2/FileManagerImpl.java)
 명령 행 에서 rmic – v 1.2 FileManager Impl 을 실행 합 니 다. 클래스 가 포장 되면 패키지 이름 (예: rmic – v 1.2 packageA. packageB. packageC. FileManager Impl) 을 추가 해 야 합 니 다.
 실행 에 성공 하면 FileManager Impl 생 성Stub. class 의 클래스 파일 입 니 다.
4. RMI 응용 프로그램 구현
[size=medium]FileServer.java[/size]
import java.io.InputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* 布署应用
*/
public class FileServer {
private static final Log log = LogFactory.getLog(FileServer.class);
public static final String CONFIG_FILE_PATH = "/conf/config.properties";

/**
* 获取配置信息
* @return URL
*/
public static Map getURL(){
try{
String url, port;
Map configs = new HashMap();
Properties prop = new Properties();
InputStream in = FileServer.class.getResourceAsStream(CONFIG_FILE_PATH);

prop.load(in);
url = prop.getProperty("server.interface");
port = prop.getProperty("server.port");
configs.put("url", url);
configs.put("port", port);

return configs;
} catch (IOException e){
System.out.println("读取配置信息失败!");
e.printStackTrace();
return null;
}
}

public static void main(String[] args){
try {
Map configs = getURL();
if(configs != null){
String port = configs.get("port").toString();
String url = configs.get("url").toString();

// 根据端口号开启一个RMI服务.也可以不指定,默认为1099
LocateRegistry.createRegistry(Integer.parseInt(port));
FileManagerImpl fileMng = new FileManagerImpl();

log.info("Binding URL:"+url);

// 注册一个RMI应用
// e.g. url: //127.0.0.1:20002/FILE_MNG
Naming.rebind(url, fileMng);
log.info("Deploy Remote File Server successfully!");
}
else{
log.error("Binding Remote File Server failed...");
}

} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}

}

5. 유지보수 에 편리 하도록 상기 프로그램 을 JAR 패키지 에 연결 하고 META - INF 의 MANIFEST. MF 파일 에서 JAR 패 키 지 를 실행 하 는 데 필요 한 Main 방법 이 있 는 클래스 등 정 보 를 지정 하 는 것 이 좋 습 니 다. 이렇게:
유 닉 스에 서 nohup 명령 으로 배경 에서 이 JAR 패 키 지 를 시작 합 니 다.
nohup java -jar lib/webapp-server.jar >> $HOME/nohupout/fileserver_log.out &
프로 세 스 를 ps – ef | grep webapp 으로 봅 니 다.
프로 세 스 가 시작 되 지 않 으 면 로그 파일 의 오류 정 보 를 봅 니 다.
[size = large] [b] 클 라 이언 트 [/b] [/size] 1. 클 라 이언 트 에 필요 한 파일 류 는 원 격 인터페이스 FileManager. java 와 관련 된 클래스, Stub 클래스 입 니 다.
비 즈 니스 클래스
Manifest-Version: 1.0
Main-Class: package1.package2..FileServer
Class-Path: webapp-server.jar commons-logging.jar log4j-1.2.15.jar

2. 요청 에 응답 하 는 Servlet 클래스 작성
[size=medium]DownloadSysFileAction.java[/size]
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import nantian.fxjk.web.util.AccessRemoteServer;

/**
* 后台文件操作业务类
*/
public class FileClient {

/**
* 获取远程服务器上的文件信息
*
* @param path 文件路径
* @param fileName 文件名
* @return
*/
public RemoteFileInfo getRemoteFile(String path, String fileName){
try{
Map configs = getConfig();

if (configs != null) {
String url = configs.get("url").toString();
String defaultPath = configs.get("abs_path").toString();

// 查找一个已布署的远程服务
// e.g. url: //128.128.96.2:20002/FILE_MNG
FileManager fileMng = (FileManager) Naming.lookup(url);

RemoteFileInfo file = fileMng.getRemoteFile(
defaultPath + path, fileName);

return file;
}
else{
System.out.println("读取配置信息失败.");
return null;
}
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (RemoteException e) {
e.printStackTrace();
return null;
} catch (NotBoundException e) {
e.printStackTrace();
return null;
}
}

/**
* 将远程服务器上的文件取到本地
*
* @param fileInfo
* @return
*/
public boolean getRemoteFileToLocal(RemoteFileInfo fileInfo,
String downloadPath) {
File path = new File(downloadPath);

if (!path.exists()) {
path.mkdirs();
}
try {
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(downloadPath + fileInfo.getFileName()));
List content = fileInfo.getContent();

for(int i=0; i out.write((byte[])content.get(i));
}
out.close();

return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}

/**
* 获取访问远程对象的相关配置信息
*
* @return 配置信息
*/
public Map getConfig() {
try {
Map configs = new HashMap();
Properties prop = new Properties();
InputStream in = FileClient.class
.getResourceAsStream(AccessRemoteServer.CONFIG_FILE_PATH);

prop.load(in);
configs.put("url", prop.getProperty("server.interface"));
configs.put("abs_path", prop.getProperty("server.path"));
configs.put("down_path", prop.getProperty("download.path"));

return configs;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}

3. 프론트 페이지 에서 다운로드 할 파일 이름과 소재 경 로 를 제공 하고 이 Servlet 를 호출 하면 원 격 서버 의 파일 을 다운로드 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기