public interface RemoteInterface extends Remote{
//메서드 정의
public int doRemotePrint(String str) throws RemoteException;
public void doPrintList(List<String> list) throws RemoteException;
public void doPrintVO(TestVO vo) throws RemoteException;
//파일 전송을 위한 메서드
public void setFiles(FileInfoVO[] fInfo) throws RemoteException;
}
public class TestVO implements Serializable{ //Marker interface (표시)
private String testId;
private int testNum;
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId;
}
public int getTestNum() {
return testNum;
}
public void setTestNum(int testNum) {
this.testNum = testNum;
}
}
FileInfoVO.java
public class FileInfoVO 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;
}
}
public class RemoteServer extends UnicastRemoteObject implements RemoteInterface{
//객체 생성 시점에도 문제가 발생할 수 있다 => RemoteServer클래스에 빨간줄 뜸
//생성자에도 throws 해주면 빨간줄 사라짐
protected RemoteServer() throws RemoteException {
super();
}
public static void main(String[] args) {
try {
//1.구현한 RMI용 객체를 클라이언트에서 사용할 수 있도록
//RMI서버 (Registry)에 등록한다.
//1-1.RMI용 인터페이스를 구현한 원격객체 생성하기
RemoteInterface inf = new RemoteServer();
//2. 구현한 객체를 클라이언트에서 찾을 수 있도록
// 'Registry객체'를 생성해서 등록한다.
//2-1. 포트번호를 지정하여 Registry객체 생성(기본포트값 : 1099)
Registry reg = LocateRegistry.createRegistry(8888);
//3. Registry서버에 제공하는 객체 등록
//형식) Registry객체변수.rebind("객체의 Alias", 원격객체) Alias:식별자
// Client는 서버에서 '원격 객체'를 바인딩 시키기 위해서 식별자(Alias) 이용해서 Client에서 lookup함
reg.rebind("server", inf);
System.out.println("RMI서버가 준비되었습니다.");
} catch (RemoteException ex) {
ex.printStackTrace();
}
}
@Override
public int doRemotePrint(String str) throws RemoteException {
int length = str.length();
System.out.println("클라이언트에서 보내온 메시지 : "+str);
System.out.println("출력 끝...");
return length;
}
@Override
public void doPrintList(List<String> list) throws RemoteException {
System.out.println("클라이어트에서 보낸 List값들...");
for (int i = 0; i < list.size(); i++) {
System.out.println((i+1) + "번째 : "+ list.get(i));
}
System.out.println("List 출력 끝..");
}
@Override
public void doPrintVO(TestVO vo) throws RemoteException {
System.out.println("클라이언트에서 보내온 TestVO객체의 값 출력");
System.out.println("testId : "+ vo.getTestId());
System.out.println("testNum : "+vo.getTestNum());
System.out.println("TestVO객체 출력 끝...");
}
@Override
public void setFiles(FileInfoVO[] fInfo) throws RemoteException {
FileOutputStream fos = null;
String dir = "d:/C_Lib/";//파일이 저장될 위치
System.out.println("파일 저장 시작...");
for (int i = 0; i < fInfo.length; i++) {
try {
fos = new FileOutputStream(dir+fInfo[i].getFileName());
//클라이언트에서 전달한 파일데이터(byte[])를 서버측에 저장한다.
fos.write(fInfo[i].getFileData());
fos.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
System.out.println("파일 저장 완료...");
}
}
public class RemoteClient {
public static void main(String[] args) {
try {
//1.등록된 서버를 찾기 위해 Registry객체를 생성한 후
// 사용할 객체를 불러온다. => 서버측의 IP와 포트번호, 디폴트시 localhost RMI 기본 포트: 1099
Registry reg = LocateRegistry.getRegistry("192.168.45.2", 8888);
RemoteInterface inf = (RemoteInterface) reg.lookup("server");
//이제부터는 불러온 원격객체의 메서드를 호출해서 사용할 수 있다.
int a = inf.doRemotePrint("안녕하세요");
System.out.println("반환값 => "+a);
System.out.println("------------------------------------------");
List<String> list = new ArrayList<String>();
list.add("대전");
list.add("대구");
list.add("광주");
list.add("인천");
inf.doPrintList(list);
System.out.println("List호출 끝");
System.out.println("------------------------------------------");
TestVO vo = new TestVO();
vo.setTestId("dditMan");
vo.setTestNum(123456);
inf.doPrintVO(vo);
System.out.println("VO 출력 메서드 호출 끝...");
System.out.println("------------------------------------------");
//파일 전송
File[] files = new File[2];
files[0] = new File("d:/D_Other/Tulips.jpg");
files[1] = new File("d:/D_Other/Tulips.jpg");
FileInfoVO[] fInfo = new FileInfoVO[files.length];
//2개의 파일을 읽어서 byte[]에 담아서 서버측 메서드에 전달하면 된다.
FileInputStream fis = null;
for (int i = 0; i < files.length; i++) {
int len = (int)files[i].length();
fis = new FileInputStream(files[i]);
byte[] data = new byte[len];
fis.read(data);// 파일 내용을 읽어서 byte배열에 저장
fInfo[i] = new FileInfoVO();
fInfo[i].setFileName(files[i].getName());
fInfo[i].setFileData(data);
}
inf.setFiles(fInfo);//서버의 파일을 저장하는 메서드 호출
System.out.println("파일 전송 작업 끝...");
System.out.println("-----------------------------------------");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}