본문 바로가기

Java SE/RMI File Transfer

RMI 시스템에서 파일 전달 예

RMI 서버측의 파일 데이터 수신 예
클라이언트에서 서버로 파일을 전달할 때는 파일 데이터를 byte 배열로 읽어서 서버측 메소드의 파라미터로 전달해주면 된다.

 @Override
 public void setFiles(FileInfo[] info) throws RemoteException { // 클라이언트가 호출할 서버측의 메소드
  FileOutputStream fout = null;
  String dir = "C:/";
  for(int i=0;i<info.length;i++){
   try{
    fout = new FileOutputStream(dir+info[i].getFilename());
    fout.write(info[i].getFiledata()); // 클라이언트에서 전달한 파일데이터(byte[])를 서버측의 디스크에 기록한다.
    fout.close();
   }catch(Exception e){
    e.printStackTrace();
   }
  }
 }



RMI 클라이언트측에서 파일 데이터를 서버로 전송하는 예

 public static void main(String[] args) throws Exception {
        RmiServer obj = (RmiServer)(Naming.lookup("rmi://208.xxx.xxx.121:1099/RemoteObject")); 
        File [] f = new File[2];
        f[0] = new File("D:/JavaTest/HelloWorld.java");
        f[1] = new File("D:/JavaTest/HelloWorld.class");
        FileInfo[] finfo = new FileInfo[2];
        for(int i=0;i<f.length;i++){ // 2개의 파일을 읽어서 byte[]에 담아서 서버측 메소드에 전달하면 된다.
           int len = (int)f[i].length();
           FileInputStream fin = new FileInputStream(f[i]);
           byte[] data = new byte[len];
           fin.read(data);
           finfo[i] = new FileInfo();
           finfo[i].setFilename(f[i].getName());
           finfo[i].setFiledata(data);
        }

        obj.setFiles(finfo);
 }


위에서 사용된 FileInfo 클래스

package netserver;

import java.io.Serializable;

public class FileInfo implements Serializable{
 
 private String filename;
 private byte[] filedata;
 
 public String getFilename() {
  return filename;
 }
 public void setFilename(String filename) {
  this.filename = filename;
 }
 public byte[] getFiledata() {
  return filedata;
 }
 public void setFiledata(byte[] filedata) {
  this.filedata = filedata;
 }
}