¿ì¸®°¡ ¸¸µé äÆÃ ÇÁ·Î±×·¥Àº äÆÃ Ŭ¶óÀÌ¾ðÆ®¿Í Ã¤ÆÃ ¼¹ö·Î ±¸¼ºÀÌ µË´Ï´Ù. äÆÃ Ŭ¶óÀÌ¾ðÆ®´Â »ç¿ëÀÚ°¡ ¸Þ½ÃÁö¸¦ ÀÔ·ÂÇϸé, ÀÔ·ÂÇÑ ¸Þ½ÃÁö¸¦ ¼¹ö¿¡ Àü¼ÛÇÕ´Ï´Ù. Áö±Ý ±¸ÇöÇϴ äÆÃ ÇÁ·Î±×·¥Àº ¼¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¸Þ¼µå¸¦ È£ÃâÇÒ ¼ö ¾ø±â ¶§¹®¿¡, Ŭ¶óÀÌ¾ðÆ®¿¡¼ ¸Þ½ÃÁö¸¦ ¿Ã·Áµµ Á¢¼ÓÁßÀÎ ´Ù¸¥ Ŭ¶óÀÌ¾ðÆ®µé¿¡°Ô ±× ¸Þ½ÃÁö¸¦ Àü´ÞÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ±× ¹®Á¦Á¡À» ÇØ°áÇϱâ À§Çؼ ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼ ÀÏÁ¤½Ã°£À» µÎ°í ¼¹ö¿¡ ÀÚµ¿À¸·Î ¹Ýº¹Á¢¼Ó, »õ·Î ÀÔ·ÂµÈ ¸Þ½ÃÁö¸¦ °¡Á®¿À´Â ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. ÂüÀ¸·Î ÇãÁ¢ÇÑ Ã¤ÆÃ ÇÁ·Î±×·¥ÀÌÁÒ. ´ë½Å °£´ÜÇϱâ´Â À̸¸ÇÑ °ÍÀÌ ¾ø½À´Ï´Ù. ÇÏÁö¸¸ ÀÌ ´ÙÀ½¿¡ ³ª¿À´Â ÄݹéÀ» ÀÌ¿ëÇÑ ¹æ¹ýÀ» »ç¿ëÇÑ´Ù¸é ¸ð¸¦±î, ÀÌ ¿¹Á¦¸¦ °¡Áö°í ½ÇÁ¦·Î äÆÃ ÇÁ·Î±×·¥À» Â¥´Â °ÍÀº ±×´ÙÁö ±ÇÇÏ°í ½ÍÁö¾Ê½À´Ï´Ù. ´ÜÁö ÀÌ·± ¹æ¹ýÀ¸·Îµµ ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©µå¸®´Â ¿¹Á¦¿¡ Áö³ªÁö ¾Ê½À´Ï´Ù. ÀÌ ¿¹Á¦´Â °£´ÜÈ÷ ¼³¸íµå¸®°í ´ÙÀ½¿¡ ³ª¿À´Â ÄݹéÀ» »ç¿ëÇÑ Ã¤ÆÃ ÇÁ·Î±×·¥À» ÀÚ¼¼È÷ ¼³¸í µå¸®°Ú½À´Ï´Ù.
±×·³ ¸ÕÀú, ¿ø°Ý °´Ã¼¿¡¼ »ç¿ëÇÒ ChatServerÀÎÅÍÆäÀ̽ºÀÔ´Ï´Ù.
PoolingChatServer.java (ChatServer¿¡¼ »ç¿ëÇÒ Interface) |
import java.rmi.*; public interface PoolingChatServer extends Remote { public abstract String[] getMessage(int index) throws RemoteException; public abstract void addMessage(String id, String message) throws RemoteException; } |
C:\JavaExample\18>javac ChatServer.java |
¸ÕÀú addMessage(String id, String message)¸Þ¼µå´Â Ŭ¶óÀ̾ðÆ®(id)°¡ º¸³½ ¸Þ½ÃÁöµéÀ» Ãß°¡·Î ÀúÀåÇÏ´Â ¿ªÇÒÀ» ÇϰԵǰí, getMessage(int index)¸Þ¼µå´Â Ŭ¶óÀÌ¾ðÆ®¿¡ º¸³»Áø ±Û°ú ÀúÀåµÈ ¸Þ½ÃÁö¸¦ °¡Á®¿À´Â ¿ªÇÒÀ» ÇÏ°Ô µÉ °ÍÀÔ´Ï´Ù.
´ÙÀ½Àº Ŭ¶óÀÌ¾ðÆ®·ÎºÎÅÍ º¸³»Áø ¸Þ½ÃÁöµéÀ» ÀúÀåÇϰí ÀÖ´Â ¸®½ºÆ®¸¦ ³»ºÎ¿¡¼ °¡Áö°í Àִ äÆÃ¼¹öÀÇ ¿ªÇÒÀ» ÇÏ´Â PoolingChatServerImplŬ·¡½ºÀÔ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ®´Â ÀÌ ¼¹ö¸¦ ÅëÇØ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¸Þ½ÃÁö¸¦ º¸³»°Å³ª »õ·Î¿î ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿À´Â ÀÛ¾÷À» ÇÒ ¼ö ÀÖ½À´Ï´Ù.
PoolingChatServerImpl.java (ChatServerÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ ChatServerImplŬ·¡½º) |
import java.rmi.*; import java.util.*; import java.rmi.server.*; public class PoolingChatServerImpl extends UnicastRemoteObject implements PoolingChatServer { protected Vector v; public PoolingChatServerImpl() throws RemoteException { v = new Vector(); } public String[] getMessage(int index) { int size = v.size(); String[] messages=new String[size-index]; for(int i=0; i<size-index; ++i) { messages[i] = (String)v.elementAt(index+i); } return messages; } public void addMessage(String id, String message) { v.addElement(id+": "+message); } public static void main(String[] args) throws Exception { PoolingChatServerImpl ChatServer = new PoolingChatServerImpl(); System.out.println("ChatServer Start!"); Naming.rebind("Chat", ChatServer); } } |
C:\JavaExample\18>javac PolingChatServer.java |
¸ÕÀú Ŭ¶óÀÌ¾ðÆ®µéÀÇ ¸Þ½ÃÁöµéÀ» ¸ðµÎ ÀúÀåÇÏ´Â º¤Å͸¦ »ý¼ºÇϰí ÀÖ½À´Ï´Ù.
n public PoolingChatServerImpl() throws RemoteException {
n v = new Vector();
n }
ÀÌ ºÎºÐÀÌ ÀڷḦ ó¸®Çϴµ¥¿¡ ÀÖ¾î¼ ¹é¹ÌÀÔ´Ï´Ù. ÀÌ Ã¤ÆÃ¼¹öÀÇ ÇÙ½ÉÀ̶ó°í ÇÒ ¼ö ÀÖ°ÚÁÒ. Ŭ¶óÀÌ¾ðÆ®¿¡¼ È£ÃâÇÒ ¿ø°Ý °´Ã¼ÀÇ ¸Þ¼µå getMessage(int index)ÀÔ´Ï´Ù. ÁÖ¾îÁø indexÀ§Ä¡¿¡¼ºÎÅÍ »õ·Î ÀúÀåµÈ ¸ðµç ¸Þ½ÃÁöµéÀ» º¹»çÇØ¼ ÀúÀåÇÏ´Â ¹è¿À» »ý¼ºÇÕ´Ï´Ù. ¼¹ö°¡ °¡Áö°í ÀÖ´Â ¸Þ½ÃÁöÀÇ ¼ö size¿¡¼ Ŭ¶óÀÌ¾ðÆ®°¡ °¡Áö°í ÀÖ´Â ¸Þ½ÃÁöÀÇ ¼ö index»©¼ ±× Å©±â¸¸ÅÀÇ ¹è¿À» »ý¼ºÇÕ´Ï´Ù. ±×·¯¸é Ŭ¶óÀÌ¾ðÆ®¿¡°Ô ¸ðÀÚ¶õ¸¸ÅÀÇ ¸Þ½ÃÁöÀÇ ¼ýÀÚ¸¦ ¾Ë ¼ö ÀÖ°ÚÁÒ.
n public String[] getMessage(int index) {
n int size = v.size();
n String[] messages=new String[size-index];
size-index¸¦ ÇÏ¸é ¾Æ½Ã´Ù½ÃÇÇ Å¬¶óÀÌ¾ðÆ®¿¡ ¾ø´Â ¸Þ½ÃÁöÀÇ °³¼ö°¡ ³ª¿É´Ï´Ù. À̰ÍÀ» for¹®À¸·Î Áõ°¡½Ã۴µ¥ Ŭ¶óÀ̾ðÆ®ÀÇ À妽ºÀÇ Å©±â¿¡ 0ºÎÅÍ ¾ø´Â °³¼ö±îÁö Áõ°¡½Ã۸é Ŭ¶óÀÌ¾ðÆ®¿¡ ¾ø´Â ¸Þ½ÃÁö¸¦ ¸ðµÎ »Ì¾Æ ³¾¼ö ÀÖ½À´Ï´Ù. »Ì¾Æ³½ ¹è¿À» À§¿¡¼ »ý¼ºÇÑ ¹è¿¿¡ Â÷·Ê·Î returnÇϰí ÀÖ½À´Ï´Ù. elementAt()¸Þ¼µå¸¦ »ç¿ëÇÏ¸é º¤ÅÍ¿¡¼ ÇØ´ç ¹øÂ°ÀÇ ±ÛÀ» »Ì¾Æ ¿À´Â °ÍÀ̶ó´Â °Ç ´Ùµé ¾Ë°í °è½Ã°ÚÁÒ?
n for(int i=0; i<size-index; ++i) {
n messages[i] = (String)v.elementAt(index+i);
n }
n return messages;
id¿Í »õ·Î¿î ¸Þ½ÃÁö¸¦ º¤ÅÍ¿¡ ÀúÀåÇÕ´Ï´Ù. ´©°¡ ½á´ÂÁö, ¾î¶² ¸Þ½ÃÁö´øÁö ºüÁü¾øÀÌ ¼ø¼´ë·Î º¤ÅÍ¿¡ µé¾î°¡°ÚÁÒ.
n public void addMessage(String id, String message) {
n v.addElement(id+": "+message);
¼¹öÀÇ ½ÃÀÛÀ» ¾Ë¸®°í, RMI Registry¿¡ ¿ø°Ý °´Ã¼ÀÇ ÂüÁ¶ÀÚ¸¦ µî·ÏÇÕ´Ï´Ù.
n System.out.println("ChatServer Start!");
n Naming.rebind("Chat", ChatServer);
ÀÌ ¼¹ö¸¦ Á¾·áÇϽ÷Á¸é ctrl+c¸¦ ÀÔ·ÂÇÏ¸é µË´Ï´Ù.
¸¶Áö¸·À¸·Î ¼¹ö¿¡ ¸Þ½ÃÁö¸¦ º¸³»°í ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼ ¼¹ö¿¡ ÁÖ±âÀûÀ¸·Î Á¢¼ÓÇÏ¿© »õ·Î¿î ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿À´Â ChatClientŬ·¡½ºÀÔ´Ï´Ù.
PoolingChatClient.java |
import java.rmi.*; import java.rmi.registry.*; import java.io.*; public class PoolingChatClient implements Runnable { protected static final int WAIT_TIME = 2000; protected String id; protected String a; public PoolingChatClient(String id) { this.id = id; System.out.println(id+"´Ô äÆÃ ½ÃÀÛ"); } protected PoolingChatServer server; protected Thread updater; public synchronized void start() throws Exception { if(updater == null) { server = (PoolingChatServer)Naming.lookup("Chat"); updater = new Thread(this); updater.start(); } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PoolingChatServer server = this.server; while((a=br.readLine()) != null){ if(a.equals("exit")){ server.addMessage(id, id+"´Ô ÅðÀå "); System.exit(-1); }else{ server.addMessage(id, a); } } } public synchronized void stop() { if(updater != null) { updater.interrupt(); updater = null; server = null; } } public void run() { int index = 0; try{ while(! Thread.interrupted()) { String[] messages = server.getMessage(index); int n = messages.length; for(int i=0; i<n; ++i) { System.out.println(messages[i]); Thread.sleep(WAIT_TIME); } index += n; } } catch(InterruptedException ie) { ie.printStackTrace(); } catch(RemoteException re) { re.printStackTrace(); } } public static void main(String[] args) throws Exception { if(args.length != 1) throw new IllegalArgumentException("ERROR!"); PoolingChatClient c = new PoolingChatClient(args[0]); c.start(); } } |
C:\JavaExample\18>javac PoolingChatServer.java |
¸ÕÀú ¾²·¹µå¸¦ ó¸®ÇϱâÀ§ÇØ RunnableÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ¿´½À´Ï´Ù. WAIT_TIME´Â Ŭ¶óÀÌ¾ðÆ®°¡ ¼¹ö¿¡ ÁÖ±âÀûÀ¸·Î Á¢¼ÓÇÒ ½Ã°£°£°ÝÀÔ´Ï´Ù. ´ÜÀ§°¡ 1/1000ÃÊ À̹ǷΠ2Ãʵ¿¾È ½¬¾ú´Ù°¡ ±ú¾î³ª¼ ¼¹ö¿¡ Á¢¼ÓÇÕ´Ï´Ù.
n public class PoolingChatClient implements Runnable {
n protected static final int WAIT_TIME = 2000;
Naming.lookup()¸Þ¼µå´Â ÁÖ¾îÁø À̸§À» °¡Áö°í ¿ø°ÝÁöÀÇ RMI Registry·ÎºÎÅÍ ¿ø°Ý ÂüÁ¶ÀÚ¸¦ ¾ò¾î¿É´Ï´Ù.
n server = (PoolingChatServer)Naming.lookup("Chat");
¸Þ½ÃÁö¸¦ ÁÖ±âÀûÀ¸·Î °¡Á®¿À´Â ¾²·¹µå¸¦ ½ÃÀÛÇÕ´Ï´Ù.
n t = new Thread(this);
n t.start();
InputStream°ú BufferedReader¸¦ ÀÌ¿ë, »ç¿ëÀÚÀÇ ÀÔ·ÂÀ» ¹Þ¾Æ³À´Ï´Ù.
n BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n PoolingChatServer server = this.server;
n while ((a=br.readLine()) != null) {
n ¡¦
n } else {
n server.addMessage(id, a);
n }
¸¸ÀÏ »ç¿ëÀÚ°¡ ¡®exit¡¯¶ó´Â ±ÛÀ» ÀÔ·ÂÇÏ¸é ¡®ÅðÀåÇÑ´Ù¡¯´Â ¸Þ½ÃÁö¸¦ ³¯·ÁÁÖ°í ÀÚµ¿ÀûÀ¸·Î Á¾·áµË´Ï´Ù.
n if (a.equals("exit")) {
n server.addMessage(id, id+"´Ô ÅðÀå ");
n System.exit(-1);
¿ø°Ý °´Ã¼ÀÇ ¸Þ¼µå getMessage(index)¸¦ È£ÃâÇÏ´Â ºÎºÐÀÔ´Ï´Ù. getMessage(index)ÀÇ ¿ªÇÒÀº À§¿¡¼ ¼³¸íµå·È¾úÁÒ.
n String[] messages = server.getMessage(index);
°¡Á®¿Â ¸Þ½ÃÁöÀÇ Å©±â¸¦ º¯¼ön¿¡ ÀúÀåÇÕ´Ï´Ù.
n int n = messages.length;
for¹®À» »ç¿ëÇÏ¿© ±× ¸Þ½ÃÁöµéÀ» Ŭ¶óÀÌ¾ðÆ®¿¡°Ô º¸¿©ÁÝ´Ï´Ù. Çѹøº¸¿©ÁÖ¸é ¾²·¹µå°¡ 2Ãʰ£ ÈÞ½ÄÀ» ÃëÇϴ±º¿ä. À̰ÍÀÌ Pooling±â¹ýÀ» »ç¿ëÇÑ Ã¤ÆÃÇÁ·Î±×·¥ÀÇ ÇѰèÀÔ´Ï´Ù. ¾÷µÈ ¸Þ½ÃÁö¸¦ ¹Ù·Î¹Ù·Î ã¾Æ°¡Áö ¸øÇÏ´Ï±î ±×¸¸Å ´À¸®°ÚÁÒ.
n for(int i=0; i<n; ++i) {
n System.out.println(messages[i]);
n Thread.sleep(WAIT_TIME);
Ŭ¶óÀÌ¾ðÆ®¿¡ ¾÷µÈ ±ÛÀÇ ¼ö¸¸Å ÀúÀåµÈ ¸Þ½ÃÁöÀÇ °³¼ö¸¦ ³ªÅ¸³»´Â index¿¡ ´õÇØ ÁÝ´Ï´Ù.
n index += n;
ÀÌÁ¦ PoolingChatClientImplŬ·¡½º¸¦ ¸¸µé¾úÀ¸´Ï ¼¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ¿øÇÒÇÑ ´ëȸ¦ À§ÇØ °¢°¢ÀÇ Stub/SkeletonÀ» »ý¼ºÇØ¾ß ÇÕ´Ï´Ù.
C:\JavaExample\18>rmic PoolingChatServerImpl C:\JavaExample\18>dir ¡¦ ChatServerImpl_Stub.class ChatServerImpl_Skel.class |
¸ðµç Áغñ°¡ ´Ù µÆÀ¸´Ï ½ÇÁ¦·Î äÆÃÇÁ·Î±×·¥À» ½ÇÇàÇØ º¸°Ú½À´Ï´Ù. ¸ÕÀú RMI Registry¸¦ ½ÇÇàÇÏ¿©¾ß ÇÕ´Ï´Ù.
C:\JavaExample\18>start rmiregistry |
±× ´ÙÀ½À¸·Î ChatServerImplŬ·¡½º¸¦ ½ÇÇà½Ãŵ´Ï´Ù.
C:\JavaExample\18>java PoolingChatServerImpl ChatServer Start! |
äÆÃÀ» Å×½ºÆ®ÇϱâÀ§ÇØ µÎ°³ÀÇ Ã¢À» ¶ç¿ö¼ ½ÇÇàÇϰڽÀ´Ï´Ù. ½ÇÇ๮ ¸»¹Ì¿¡ »ç¿ëÇϰíÀÚÇÏ´Â ¾ÆÀ̵𸦠µ¡ºÙ¿© ÁÖ¸é µË´Ï´Ù. ÅðÀåÇÏ½Ç ¶§¿¡´Â ¡®exit¡¯¸¦ ÀÔ·ÂÇÏ½Ã¸é µË´Ï´Ù.
C:\JavaExample\18>java PoolingChatClient haha haha´Ô äÆÃ ½ÃÀÛ hi~! haha: hi~! hoho: hello~! hoho: hoho´Ô ÅðÀå exit C:\JavaExample\18> |
C:\JavaExample\18>java PoolingChatClient hoho hoho´Ô äÆÃ ½ÃÀÛ haha: hi~! hello~! hoho: hello~! Exit C:\JavaExample\18> |
°£´ÜÇÏ°Ô Ã¤ÆÃ ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸¾Ò½À´Ï´Ù. ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Ã¤ÆÃ ÇÁ·Î±×·¥º¸´Ù´Â ¼Õ½±°Ô ¸¸µé¼ö ÀÖ¾ú½À´Ï´Ù. ¹°·Ð ±×¸¸Å ºÎÁ·ÇÑ Á¡µµ ¸¹Áö¸¸¿ä. ƯÈ÷ CPU°¡ ¸¹Àº °í»ýÀ» ÇÏ´Ï±î µÎ°³ ÀÌ»ó ¶ç¿ì¸é ÄÄÇ»ÅͰ¡ ´Ù¿îµÉÁöµµ ¸ð¸£´Ï ÁÖÀÇÇϼ¼¿ä. ´ÙÀ½Àº ÄݹéÀ» ÀÌ¿ëÇÑ Ã¤ÆÃ ÇÁ·Î±×·¥À» ÀÛ¼ºÇغ¸°Ú½À´Ï´Ù.
¢Ñ Pooling |
Ŭ¶óÀÌ¾ðÆ®´Â ¼¹ö¿¡ ¸Þ½ÃÁö¸¦ º¸³»°í ¾÷µ¥ÀÌÆ®µÈ ¸Þ½ÃÁö¸¦ ¹Þ±âÀ§ÇØ ¼¹ö¿¡ Á¢¼ÓÇÑ´Ù. ¼¹ö´Â »õ·Î¿î ¸Þ½ÃÁö¸¦ ÀúÀåÇϱ⸸ ÇÒ »Ó, ¸Þ½ÃÁö¸¦ º¸³»ÁÖÁö´Â ¾Ê´Â´Ù. ¸Þ½ÃÁö¸¦ ¿Ã¸®°í ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¿À´Â °Í, ¸ðµÎ Ŭ¶óÀ̾ðÆ®ÀÇ ¸òÀÌ´Ù. Ŭ¶óÀÌ¾ðÆ®¿¡¼¸¸ ¼¹ö¿¡ ¿ø°Ý¸Þ¼µå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. |
jabookÀúÀÚ¸íÇÔ |
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù4ºÎ ÀúÀÚ:ÃÖ¿µ°ü |