[RMI] Remote host에서 rmiregistry 구동에 대한 문의
안녕하세요?
보통 RMI 통신에서 서버측 local host에 rmiregistry를 띄우고, 클라이언트에서 이 rmiregistry를 참조하여 원격객체를 호출하는데요.
서버 : rmiregistry 실행 -> 원격객체를 rmiregistry에 등록
클라이언트 : Stub 클래스파일과 서버측 rmiregistry를 참조하여 원격객체를 호출
rmiregistry를 서버측에서 띄우지 않고, remote host에 띄울수 있는 방법이 있나요??
클라이언트(혹은 제3의 host) : rmiregistry 실행
서버 : 원격객체를 remote host의 rmiregistry에 등록
클라이언트 : Stub 클래스파일과 클라이언트(혹은 제3의 host) rmiregistry를 참조하여 원격객체를 호출
논리적으로 문제가 되지 않을것 같아 아래와 같이 코딩하였습니다.
1. 클라이언트(혹은 제3의 host, 147.46.XX.XXX) $ rmiregistry &
2. 서버 (147.46.YY.YYY)
Registry reg = LocateRegistry.getRegistry("//147.46.XX.XXX", 1099); reg.rebind("VolumeServer", obj);
이렇게 하고 서버(147.46.YY.YYY)에서 객체를 원격의 rmiregistry(147.46.XX.XXX)에 등록하려하니 아래와 같이 에러가 나네요..
[hslee@diplab rmi_gisk_2]$ java VolumeImpl VolumeImpl error: RemoteException occurred in server thread; nested exception is: java.rmi.AccessException: Registry.Registry.bind disallowed; origin /147.46.YYY.YY is non-local host java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.AccessException: Registry.Registry.bind disallowed; origin /147.46.YYY.YY is non-local host at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240) at sun.rmi.transport.Transport$1.run(Transport.java:153) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:149) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701) at java.lang.Thread.run(Thread.java:595) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343) at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) at VolumeImpl.main(VolumeImpl.java:41) Caused by: java.rmi.AccessException: Registry.Registry.bind disallowed; origin /147.46.219.66 is non-local host at sun.rmi.registry.RegistryImpl.checkAccess(RegistryImpl.java:223) at sun.rmi.registry.RegistryImpl.bind(RegistryImpl.java:119) at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240) at sun.rmi.transport.Transport$1.run(Transport.java:153) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:149) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701) at java.lang.Thread.run(Thread.java:595)
Remote host에 있는 rmiregistry에 객체를 등록할 방법이 없을까요?? :shock:
외국 사이트를 찾아보니 RMI 스펙에서 rmiregistry를 local에서만 등록가능하게 만들어 놨기 때문에 안되는것이라는데요..
LocateRegistry.getRegistry("hostname", port) 메소드를 사용해서 원격 registry에 대한 참조를 얻어올수가 있는데 왜 그 참조를 이용해서 binding이 안되는것인지 이해가 안되네요.
질문이 길지만 아시는분들은 답변주시면 감사하겠습니다.
그럼~ :D
댓글 달기