2020.11.10 고급자바 RmiClient, RmiServer

 공통 1) 인터페이스

RmiTestInterface


package kr.or.ddit.inf;


import java.rmi.Remote;

import java.rmi.RemoteException;

import java.util.List;


import kr.or.ddit.vo.FileInfoVO;

import kr.or.ddit.vo.testVO;


/*

    원격지에서 호출할 수 있는 메서드를 선언하는 interface 

    즉 RMI 용 interface 는 Remote 를 상속해서 작성해야 한다. 

    

 */


public interface RmiTestInterface extends Remote {


// 이 인터페이스에서 선언되는 모든 메서드들은 RemoteException 을 throws 해서 선언해야한다.

// 그리고 이 곳에서 선언된 메서드의 파라미터 변수는 클라이언트쪽에서 서버쪽으로 보내는 데이터가 되고,

// 선언된 메서드의 반환값은 서버에서 처리한 결과가 클라이언트에게 전달되는 데이터이다.


public int doRemotePrint(String str) throws RemoteException;


public void doPrintList(List<String> list) throws RemoteException;


public void doPrintVo(testVO vo) throws RemoteException;

//파일 전송용 메서드 

public void transFile(FileInfoVO fileVo) throws RemoteException; 

}



공통 2 ) FileInforVO 


package kr.or.ddit.vo;

//파일 전송용 VO 클래스


import java.io.Serializable;  //직렬화.. 직렬화 : 자바 시스템 내부에서 사용되는 Object 또는 //Date 를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 것 


public class FileInfoVO implements Serializable {


private String fileName; // 파일명이 저장될 변수

private byte[] fileDate; // 파일의 내용이 저장될 변수


public String getFileName() {

return fileName;

}


public void setFileName(String fileName) {

this.fileName = fileName;

}


public byte[] getFileDate() {

return fileDate;

}


public void setFileDate(byte[] fileDate) {

this.fileDate = fileDate;

}


public static void main(String[] args) {


}


}



공통 3 ) testVO


package kr.or.ddit.vo;

import java.io.Serializable;

/*
 * RMI 통신에서 데이터 전달용으로 사용할 객체 작성하기 => 이 객체는 네트워크를 통해서 데이터가 전달되어야 하기 때문에 직렬화가
 * 필요하다. -> 그래서 Serializable 을 구현하여 작성해야 한다.
 * 
직렬화 : 자바 시스템 내부에서 사용되는 Object 또는 //Date 를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 것
 */

public class testVO implements Serializable {

private String id;
private int num;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public int getNum() {
return num;
}

public void setNum(int num) {
this.num = num;
}

public static void main(String[] args) {

}

}



RemoteServer 



package kr.or.ddit.server;

import java.io.FileOutputStream;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

import kr.or.ddit.inf.RmiTestInterface;
import kr.or.ddit.vo.FileInfoVO;
import kr.or.ddit.vo.testVO;

/*
 RMI 기술을 제공하는 클래스 만들기
  => RMI 용 인터페이스를 구현하고 , UnicastRemoteObject 를 상속해서 작성한다. 
 
 */

public class RemoteServer extends UnicastRemoteObject implements RmiTestInterface {

// 생성자도 RemoteException 을 throws 해서 반드시 작성한다.
// 기본 생성자도 반드시 작성해야 한다.
        // 생성자를 내가 정의를 따로 한다면 컴파일러가 자동으로 기본 생성자를 생성하지 않기 때문에 기본 생성자를 생성하기 위해서는 내가 따로 기본 생성자를 생성해줘야한다. 




public RemoteServer() throws RemoteException {
}

@Override
public int doRemotePrint(String str) throws RemoteException {
// TODO Auto-generated method stub
int len = str.length();

System.out.println("doRemotePrint() 메서드 시작");
System.out.println("클라이언트에서 보내온내용 : " + str);

System.out.println("doRemotePrint() 메서드 끝");

return len; // 이 반환값은 클라이언트로 보내지는 값이다.

}

@Override
public void doPrintList(List<String> list) throws RemoteException {
System.out.println("doPrintList() 메서드 시작..");
for (int i = 0; i < list.size(); i++) {
System.out.println(i + "번째 자료 : " + list.get(i));
}
System.out.println("doPrintList() 메서드 끝..");
System.out.println();

// TODO Auto-generated method stub

}

@Override
public void doPrintVo(testVO vo) throws RemoteException {
System.out.println("doPrintVo() 메서드 시작...");
System.out.println("ID l " + vo.getId());
System.out.println("NUM : " + vo.getNum());
System.out.println("doPrintVo() 끝...");
System.out.println();

}

// 클라이언트가 보내온 파일 정보를 이용하여 서버에 해당 파일을 저장한다.
@Override
public void transFile(FileInfoVO fileVo) throws RemoteException {
String dir = "d:/D_Other/연습용/"; //파일이 저장될 폴더
System.out.println("파일저장 시작") ; 

FileOutputStream fout = null ; 
try {
//클라이언트가 보내온 파일명을 이용하여 스트림 객체 생성
fout = new FileOutputStream (dir + fileVo.getFileName()); 
//클라이언트가 보내온 파일 데이터 (byte[]) 가 저장한다. 
fout.write(fileVo.getFileDate());
fout.flush();
fout.close();
} catch (IOException e) {
// TODO: handle exception
}
System.out.println("파일 저장 끝");
}

public static void main(String[] args) {
// rmi 서비스를 제공하는 과정

try {
// 1. rmi 용 인터페이스를 구현한 객체의 인스턴스를 생성한다.
// (이때 변수는 RMI 용 인터페이스 자료형으로 선언한다. )
RmiTestInterface inf = new RemoteServer();

// 2. 구현한 객체를 클라이언트가 찾을 수 있도록 관리하는 Registry 객체를 생성한다.
// 이때 통신에서 사용할 포트번호를 지정하여 생성한다.
// rmi 의 기본포트번호는 1099 번이다.
Registry reg = LocateRegistry.createRegistry(9900);

// 3. Registry 객체에 서버에서 제공하는 객체를 등록한다.
// 즉 RMI 용 인터페이스를 구현한 객체의 인스턴스를 등록한다.
// 형식 : Registry 객체변수.rebind("객체의 Alias 명", RMI 용 객체의 인스턴스 ) ;
// => 이곳에서 지정한 '객체의Alias 명'은 클라이언트에서 이 객체를 구할 때 사용한다.
reg.rebind("server", inf);

System.out.println("서버가 준비되었습니다.");
// ( wmr, rmi 용 인터페이스를 구현한 객체의 인스턴스를 등록한다. )

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

}

}


RemoteClient 



package kr.or.ddit.client;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import kr.or.ddit.inf.RmiTestInterface;
import kr.or.ddit.vo.FileInfoVO;
import kr.or.ddit.vo.testVO;

public class RemoteClient {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// RMI용 객체를 서버에서 구해와서 사용하는 순서

try {

// 1. 서버에서 등록한 RMI 용 객체를 찾기 위해 Registry 객체를 생성한다.
// (getRegistry() 메서드에 서버의 IP 주소와 포트번호를 지정하여 생성한다.
Registry reg = LocateRegistry.getRegistry("localhost", 9900);

// 2. 서버에서 등록한 '객체의 Alias명 ' 을 이용하여 객체를 불러온다.
// 형식 ) Registry객체변수.lookup('객체의 Alias 명 ' )
RmiTestInterface inf = (RmiTestInterface) reg.lookup("server");
// 3. 이제부터 불러온 객체의 메서드를 호출해서 사용할 수 있다. 
System.out.print("서버로 전송할 메세지 입력>>");
String msg = scan.nextLine(); 
int a = inf.doRemotePrint(msg); 
System.out.println("서버의 반환값 : " + a);
System.out.println();
List<String> list = new ArrayList<>();
list.add("복숭아");
list.add("사과");
list.add("배"); 
list.add("대추");
list.add("감");
inf.doPrintList(list); 
System.out.println("List 전송중...");
System.out.println();
testVO testVo = new testVO();
testVo.setId("A001");
testVo.setNum(12345);
inf.doPrintVo(testVo);
System.out.println("VO객체 전송 끝 ");
System.out.println();
// 파일 전송하기 
File file = new File("D:/A_TeachingMaterial/5.JQuery/images/cloud03.jpg");
if (!file.exists()) {
System.out.println(file.getName() + "파일이 없습니다.");
return;
}
FileInfoVO fileVo = new FileInfoVO();
//파일의 용량을 구해서 FileInfoVO 의 fileData 배열의 길이를 결정한다. 
int len = (int)file.length();
byte[] data = new byte[len]; 
//파일 입력용 스트림 객체 
FileInputStream fin = new FileInputStream(file);
//파일 내용을 읽어와 byte 형 배열에 저장한다. 
fin.read(data); 
//구해온 정보를 FileInforVO 객체에 생성한다. 
fileVo.setFileName(file.getName()); // 파일 명 저장 
fileVo.setFileDate(data); // 파일 내용 저장
//서버의 파일 전송용 메서드를 호출 
inf.transFile(fileVo);
System.out.println("파일 전송 작업 끝.....");
} catch (RemoteException e) {
// TODO: handle exception
} catch (NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}







댓글