¼Ò¼³°°Àº ÀÚ¹Ù 4ºÎ  Á¦18Àå R M I  18.5.1 Pooling ±â¹ýÀ» »ç¿ëÇÑ Ã¤ÆÃ  

 

18.5.1 Pooling ±â¹ýÀ» »ç¿ëÇÑ Ã¤ÆÃ

 

¿ì¸®°¡ ¸¸µé äÆÃ ÇÁ·Î±×·¥Àº äÆÃ Ŭ¶óÀÌ¾ðÆ®¿Í Ã¤ÆÃ ¼­¹ö·Î ±¸¼ºÀÌ µË´Ï´Ù. äÆÃ Ŭ¶óÀÌ¾ðÆ®´Â »ç¿ëÀÚ°¡ ¸Þ½ÃÁö¸¦ ÀÔ·ÂÇϸé, ÀÔ·ÂÇÑ ¸Þ½ÃÁö¸¦ ¼­¹ö¿¡ Àü¼ÛÇÕ´Ï´Ù. Áö±Ý ±¸ÇöÇϴ äÆÃ ÇÁ·Î±×·¥Àº ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¸Þ¼­µå¸¦ È£ÃâÇÒ ¼ö ¾ø±â ¶§¹®¿¡, Ŭ¶óÀÌ¾ðÆ®¿¡¼­ ¸Þ½ÃÁö¸¦ ¿Ã·Áµµ Á¢¼ÓÁßÀÎ ´Ù¸¥ Ŭ¶óÀÌ¾ðÆ®µé¿¡°Ô ±× ¸Þ½ÃÁö¸¦ Àü´ÞÇÒ ¼ö°¡ ¾ø½À´Ï´Ù. ±× ¹®Á¦Á¡À» ÇØ°áÇϱâ À§Çؼ­ ¾²·¹µå¸¦ ÀÌ¿ëÇØ¼­ ÀÏÁ¤½Ã°£À» µÎ°í ¼­¹ö¿¡ ÀÚµ¿À¸·Î ¹Ýº¹Á¢¼Ó, »õ·Î ÀÔ·ÂµÈ ¸Þ½ÃÁö¸¦ °¡Á®¿À´Â ¹æ¹ýÀ» »ç¿ëÇÕ´Ï´Ù. ÂüÀ¸·Î ÇãÁ¢ÇÑ Ã¤ÆÃ ÇÁ·Î±×·¥ÀÌÁÒ. ´ë½Å °£´ÜÇϱâ´Â À̸¸ÇÑ °ÍÀÌ ¾ø½À´Ï´Ù. ÇÏÁö¸¸ ÀÌ ´ÙÀ½¿¡ ³ª¿À´Â ÄݹéÀ» ÀÌ¿ëÇÑ ¹æ¹ýÀ» »ç¿ëÇÑ´Ù¸é ¸ð¸¦±î, ÀÌ ¿¹Á¦¸¦ °¡Áö°í ½ÇÁ¦·Î äÆÃ ÇÁ·Î±×·¥À» Â¥´Â °ÍÀº ±×´ÙÁö ±ÇÇÏ°í ½ÍÁö¾Ê½À´Ï´Ù. ´ÜÁö ÀÌ·± ¹æ¹ýÀ¸·Îµµ ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» º¸¿©µå¸®´Â ¿¹Á¦¿¡ Áö³ªÁö ¾Ê½À´Ï´Ù. ÀÌ ¿¹Á¦´Â °£´ÜÈ÷ ¼³¸íµå¸®°í ´ÙÀ½¿¡ ³ª¿À´Â ÄݹéÀ» »ç¿ëÇÑ Ã¤ÆÃ ÇÁ·Î±×·¥À» ÀÚ¼¼È÷ ¼³¸í µå¸®°Ú½À´Ï´Ù.

 

±×·³ ¸ÕÀú, ¿ø°Ý °´Ã¼¿¡¼­ »ç¿ëÇÒ 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ºÎ
ÀúÀÚ:ÃÖ¿µ°ü