Remote로 사용할 Data Object
import java.io.*; public class TestDataObj implements Serializable { private int Tag; private int Stat; public void setTag(int iTag) { this.TagNo = iTag; } public void setStat(int iStat) { this.Stat = iStat; } public int getTag() { return this.Tag; } public int getStat() { return this.Stat; } }
넘길 Object를 직렬화 해줘야 하기 때문에 implements Serializable 해줘야 한다.
Interface 선언
import java.rmi.*; public interface IReadData extends Remote { public TestDataObj GetTestDataObj() throws RemoteException; }
rmi에서 사용할 Data Object
import java.rmi.server.*; import java.rmi.*; import java.io.*; public class ReadDataImpl extends UnicastRemoteObject implements IReadData { public ReadDataImpl() throws RemoteException { super(); } public TestDataObj GetTestDataObj() { TestDataObj Data = new TestDataObj(); Data.setTag(1); Data.setStat(5); return rtlData; } }
rmi Server
import java.rmi.*; import java.net.*; public class RmiShmServer { public static void main(String[] args) { try { ReadDataImpl remoteObj = new ReadDataImpl (); Naming.rebind("rmi://localhost:1099/TestRemote", remoteObj); System.out.println("Test Remote Obj Bound to the registry"); } catch (RemoteException e) { System.err.println("incoming method call" + e); } catch (MalformedURLException e) { System.err.println("Checking URL " + e); } } }
rmi 주소를 넣어 줄시 rmi://localhost:[port]/[Remote Object] 형식으로 만들어 준다
나중에 rmiregistry 등록시 port를 기입 해준다.
rmi Client
import java.rmi.*; import java.net.*; public class RmiShmClinet { public static void main(String[] args) { try { Object obj = Naming.lookup("rmi://localhost:1099/TestRemote"); IReadData remoteObj = (IReadData)obj; TestDataObj Data = remoteObj.GetTestDataObj(); System.out.println(Data.getTag() + ":" + Data.getStat()); } catch (RemoteException e) { System.out.println("Somthig has gone wrong during reote method call.." + e); } catch (NotBoundException e) { System.out.println("Could't Bound.. "); } catch (java.net.MalformedURLException e) { System.out.println("Check url String.."); } } }
Server에서 선언한 주소를 사용하여 Remote Object를 바라본다.
unix 명령어
1차 console
prompt>javac *.java
prompt>rmic ReadDataImpl
prompt>rmiregistry 1099 &
(Background로 rmiregistry 실행)
prompt>java RmiShmServer
2차 console
prompt>java RmiShmClinet
Data 확인
Compile이 잘 되지 않을 경우 profile의 classpath를 잡아 준다.
CLASSPATH=경로:.
export CLASSPATH
대략 이런식이 되겠지?!