RMI with Servlet example
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));
}
}