Java SE/RMI with Servlet

RMI with Servlet example

Soul-Learner 2011. 5. 13. 18:31

Eclipse에서 Java Project를 생성하여 RMI 서버를 작성하고, 이 서버에 접속할 클라이언트는 Dynamic Web Project의 서블릿이 되도록 2개의 프로젝트를 생성한다. 이 때 서버측 자바 패키지를 복사하여 클라이언트인 웹 프로젝트에도 붙여넣기 해 주면 서블릿에서 원격인터페이스를 찾지 못하여 ClassNotFoundException이 발생하는 문제를 해결할 수 있다.
RmiClientServlet.java

package rmiclient;

import java.io.*;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import netserver.*;

public class RmiClientServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;

 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //System.setSecurityManager(new RMISecurityManager());
        RmiServer obj = null;
        try {
           obj = (RmiServer)(Naming.lookup("rmi://localhost:1099/RemoteObject"));
        } catch (NotBoundException e) {
           e.printStackTrace();
        }
        Employee emp = obj.getEmployee(100);
        response.setContentType("text/html;charset=euc-kr");
        PrintWriter out = response.getWriter();
        int empno = emp.getEmpno();
        String ename = emp.getEname();
        out.println("번호:"+empno+"<br/>");
        out.println("이름:"+ename+"<br/>");
 }
}

아래에 있는 패키지는 RMI서버측 패키지이며 이 패키지를 복사하여 위의 서블릿이 포함된 프로젝트에도 넣어 주면 된다.

RmiServer.java

package netserver;

public interface RmiServer extends java.rmi.Remote {
 public Employee getEmployee(int empno) throws java.rmi.RemoteException;
}




Employee.java

package netserver;

import java.io.Serializable;

public class Employee implements Serializable {
 private String ename;
 private int empno;
 
 public Employee(String ename, int empno) {
  super();
  this.ename = ename;
  this.empno = empno;
 }
 public String getEname() {
  return ename;
 }
 public void setEname(String ename) {
  this.ename = ename;
 }
 public int getEmpno() {
  return empno;
 }
 public void setEmpno(int empno) {
  this.empno = empno;
 }
}


RmiServerImpl.java

package netserver;

import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class RmiServerImpl extends UnicastRemoteObject
implements RmiServer {

 protected RmiServerImpl() throws RemoteException {
  super();
 }

 public static void main(String[] args) {
  //System.setSecurityManager(new RMISecurityManager());
  RmiServerImpl server =  null;
  try {
   server = new RmiServerImpl();
   Registry registry = LocateRegistry.createRegistry(1099);// default:1099
     registry.rebind("RemoteObject", server);
     System.out.println("원격객체가 등록됨");
  }catch(Exception e){ e.printStackTrace(); }
 }

 @Override
 public Employee getEmployee(int empno) throws RemoteException {
  return new Employee("홍길동", empno);
 }
}


애플리케이션 클라이언트 예

package netclient;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;

import netserver.RmiServer;

public class RmiClient {

 public static void main(String[] args) throws Exception {
        //System.setSecurityManager(new RMISecurityManager());
        RmiServer obj = (RmiServer)(Naming.lookup("rmi://localhost:1099/RemoteObject"));
        System.out.println(obj.getEmployee(100));
 }
}