공통 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();
}
}
}
댓글
댓글 쓰기