IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

MerlinÀ¸·Î ÀÚ¹Ù Ç÷§Æû¿¡ nonblocking ÀÔÃâ·Â °¡´É
»õ·Ó°Ô Ãß°¡µÈ ±â´Éµé

Aruna Kalagnanam, ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î, IBM
Balu G, ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î, IBM
2002³â 3¿ù

ÀÚ¹Ù ±â¼ú Ç÷§Æû¿¡¼­´Â ¿À·§µ¿¾È nonblocking ÀÔÃâ·Â ¸ÞÄ«´ÏÁòÀÌ Áö¿¬µÇ¾î ¿Ô´Ù. ´ÙÇàÈ÷µµ Merlin (JDK 1.4)Àº °ÅÀÇ ¸ðµç »óȲ¿¡ Àû¿ëµÇ´Â ¸¶¹ý ÁöÆÎÀ̸¦ °¡Áö°í ÀÖ°í, ºí·ÏÈ­µÈ ÀÔÃâ·ÂÀ» Ǫ´Â °ÍÀÌ ÀÌ ¸¶¹ý»çÀÇ Àü°øÀÌ´Ù. ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾îÀÎ Aruna Kalagnanam¿Í Balu G´Â MerlinÀÇ »õ·Î¿î ÀÔÃâ·Â ÆÐÅ°ÁöÀÎ java.nio (NIO)ÀÇ nonblocking ±â´ÉÀ» ¼Ò°³ÇÏ°í, NIO°¡ ÇÒ ¼ö ÀÖ´Â °ÍÀ» º¸¿© ÁÖ±â À§ÇØ ¼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀÇ ¿¹¸¦ »ç¿ëÇÑ´Ù.

¼ö¸¹Àº Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ÀûÀýÇÑ ½Ã°£ ³»¿¡ ó¸®ÇÏ´Â ¼­¹öÀÇ ´É·ÂÀº ÀÔÃâ·Â ½ºÆ®¸²À» ¾ó¸¶³ª È¿°úÀûÀ¸·Î »ç¿ëÇÏ´À³Ä¿¡ ´Þ·Á ÀÖ´Ù. µ¿½Ã¿¡ ¼ö¹é´ëÀÇ Å¬¶óÀ̾ðÆ®¿¡°Ô ¼­ºñ½º¸¦ Á¦°øÇÏ´Â ¼­¹ö´Â ÀÔÃâ·Â ¼­ºñ½º¸¦ µ¿½Ã¿¡ »ç¿ëÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. JDK 1.4 (Merlin) ÀÌÀü±îÁö ÀÚ¹Ù Ç÷§ÆûÀº nonblocking ÀÔÃâ·Â È£ÃâÀ» Áö¿øÇÏÁö ¾Ê¾Ò´Ù. ÀÚ¹Ù ¾ð¾î·Î ÀÛ¼ºµÈ ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®¿¡ ´ëÇØ °ÅÀÇ 1´ë 1 ºñÀ²ÀÇ ½º·¹µå¸¦ °¡Áö±â ¶§¹®¿¡ ¾öû³­ ½º·¹µå °úºÎÇϸ¦ °¡Á® ¿À±â ½±°í, ÀÌ´Â ¼º´É»óÀÇ ¹®Á¦¿Í È®À强 °á¿©¶ó´Â °á°ú¸¦ ³º´Â´Ù.

ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ »õ·Î¿î Ŭ·¡½ºµéÀÌ ÃֽŠÃâ½ÃÆÇÀÇ ÀÚ¹Ù Ç÷§Æû¿¡ µµÀԵǾú´Ù. MerlinÀÇ java.nio ÆÐÅ°Áö¿¡´Â ½º·¹µå °úºÎÇϸ¦ ÇØ°áÇϱâ À§ÇÑ ¹æ¹ýµéÀÌ °¡µæ µé¾î Àִµ¥, °¡Àå Áß¿äÇÑ °ÍÀÌ SelectableChannel°ú Selector Ŭ·¡½ºÀÌ´Ù. channelÀº Ŭ¸®¾î¾ðÆ®¿Í ¼­¹ö°£ÀÇ Åë½Å¼ö´ÜÀ» ³ªÅ¸³½´Ù. selector´Â À©µµ¿ì ¸Þ½ÃÁö ·çÇÁ¿Í À¯»çÇѵ¥ selector´Â ´Ù¸¥ Ŭ¶óÀ̾ðÆ®µé·Î ºÎÅÍ ´Ù¾çÇÑ À̺¥Æ®¸¦ ĸÃÄÇÏ¿© °¢°¢ÀÇ À̺¥Æ® ó¸®ÀÚ¿¡°Ô º¸³½´Ù. ÀÌ ±Û¿¡¼­ ¿ì¸®´Â ÀÌ µÎ Ŭ·¡½º°¡ ÇÔ²² ÀÛµ¿ÇÏ¿© ÀÚ¹Ù Ç÷§Æû¿¡ ´ëÇÑ nonblocking ÀÔÃâ·Â ¸ÞÄ¿´ÏÁòÀ» »ý¼ºÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÖ°Ú´Ù.

Merlin ÀÌÀüÀÇ ÀÔÃâ·Â ÇÁ·Î±×·¡¹Ö

Merlin ÀÌÀüÀÇ °£´ÜÇÑ ¼­¹ö ¼ÒÄÏ ÇÁ·Î±×·¥À» »ìÆ캸´Â °ÍÀ¸·Î ½ÃÀÛÇغ¸ÀÚ. ServerSocket Ŭ·¡½ºÀÇ Áß¿äÇÑ ±â´ÉÀº ´ÙÀ½°ú °°´Ù.:

  • ¿¬°á Á¢¼ö
  • Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû Àбâ
  • ¿äû¿¡ ´ëÇÑ ¼­ºñ½º Á¦°ø

ÄÚµå ÀϺθ¦ »ç¿ëÇÏ¿© ÀÌ ´Ü°èµéÀ» °¢°¢ »ìÆ캸ÀÚ. ¿ì¼± ¿ì¸®´Â »õ·Î¿î ServerSocket ÇÁ·Î±×·¥À» ÀÛ¼ºÇÑ´Ù.:


ServerSocket s = new ServerSocket();

±× ´ÙÀ½, µé¾î¿À´Â È£ÃâÀ» Á¢¼öÇÏ°íÀÚ ÇÑ´Ù. ¿©±â¿¡¼­´Â accept() È£ÃâÀÌ À̸¦ ¼öÇàÇÏÁö¸¸, ¿©·¯ºÐÀÌ ÁÖÀÇÇØ¾ß ÇÒ ÀÛÀº ÇÔÁ¤ÀÌ ÀÖ´Ù.:


Socket conn = s.accept( );

accept() È£ÃâÀº ¼­¹ö ¼ÒÄÏÀÌ Å¬¶óÀ̾ðÆ®ÀÇ ¿¬°á ¿äûÀ» ¹Þ¾ÆµéÀÏ ¶§±îÁö ºí·ÏÈ­µÈ´Ù. ÀÏ´Ü ¿¬°áÀÌ ÀÌ·ç¾îÁö¸é ¼­¹ö°¡ LineNumberReader¸¦ »ç¿ëÇØ Å¬¶óÀ̾ðÆ® ¿äûÀ» Àд´Ù. LineNumberReader´Â ¹öÆÛ°¡ °¡µæÂû ¶§±îÁö µ¥ÀÌÅ͸¦ Å« ´ÜÀ§·Î ÀÐ¾î ³ª°¡±â ¶§¹®¿¡ È£ÃâÀº Àб⠻óÅ¿¡¼­ ºí·ÏÈ­µÈ´Ù. ´ÙÀ½ ¿¹Á¦ ÄÚµå´Â ½ÇÇàÁßÀÎ LineNumberReader¸¦ º¸¿©ÁØ´Ù. (ºí·Ï°ú ¸ðµç °Í)


InputStream in = conn.getInputStream();
InputStreamReader rdr = new InputStreamReader(in);
LineNumberReader lnr = new LineNumberReader(rdr);
Request req = new Request();
while (!req.isComplete() )
{
   String s = lnr.readLine();
   req.addLine(s);
}

InputStream.read()´Â µ¥ÀÌÅ͸¦ Àд ¶Ç ´Ù¸¥ ¹æ¹ýÀÌ´Ù. ºÒÇàÈ÷µµ read ¸Þ¼Òµå ¿ª½Ã write ¸Þ¼Òµåó·³ µ¥ÀÌÅÍ°¡ »ç¿ëµÉ ¶§±îÁö ºí·ÏÈ­µÈ´Ù.

±×¸² 1Àº ¼­¹öÀÇ ÀϹÝÀûÀÎ ÀÛ¾÷À» º¸¿©ÁØ´Ù. ±½Àº ¼±ÀÌ ºí·ÏÈ­ ÀÛ¾÷À» ³ªÅ¸³½´Ù.

±×¸² 1. ÀÛµ¿ÁßÀÎ ÀÏ¹Ý ¼­¹ö
A blocking 1/O diagram

JDK 1.4 ÀÌÀü¿¡´Â ½º·¹µå¸¦ ÀÚÀ¯·Ó°Ô »ç¿ëÇÏ´Â °ÍÀÌ ºí·ÏÈ­¸¦ ÇÇÇÏ´Â °¡Àå ÀϹÝÀûÀÎ ¹æ½ÄÀ̾ú´Ù. ±×·¯³ª ÀÌ ¼Ö·ç¼ÇÀº ½º·¹µå °úºÎÇ϶ó´Â ¹®Á¦¸¦ ÀÏÀ¸Ä״µ¥, ÀÌ´Â ¼º´É°ú È®À强 ¾çÂÊ¿¡ ¿µÇâÀ» ¹ÌÃÆ´Ù. ±×·¯³ª Merlin°ú java.nio ÆÐÅ°Áö°¡ ³ª¿È¿¡ µû¶ó ¸ðµç °ÍÀÌ º¯È­µÇ¾ú´Ù.

À̾îÁö´Â ¼½¼Çµé¿¡¼­´Â java.nioÀÇ ±âÃÊ »çÇ×µéÀ» »ìÆ캸°í, À§¿¡¼­ ¼³¸íÇÑ ¼­¹ö ¼ÒÄÏ ¿¹Á¦¸¦ ¼öÁ¤Çϴµ¥ ¿ì¸®°¡ ¹è¿î °Í Áß ÀϺθ¦ Àû¿ëÇØ º¸°Ú´Ù.

Reactor ÆÐÅÏ

NIO ¼³°è µÚ¿¡ ÀÖ´Â ÁÖµÈ ÈûÀº Reactor ÆÐÅÏÀÌ´Ù. ºÐ»ê ½Ã½ºÅÛ¿¡¼­ ¼­¹ö ¾ÖÇø®ÄÉÀ̼ÇÀº ¼­ºñ½º ¿äûÀ» º¸³»´Â ¿©·¯ Ŭ¶óÀ̾ðÆ®¸¦ ó¸®ÇØ¾ß ÇÑ´Ù. ±×·¯³ª ƯÁ¤ ¼­ºñ½º¸¦ È£ÃâÇϱâ Àü¿¡ ¼­¹ö ¾ÖÇø®ÄÉÀ̼ÇÀº µé¾î ¿À´Â °¢ ¿äûÀ» ³ª´©¾î »óÀÀÇÏ´Â ¼­ºñ½º Á¦°øÀÚ¿¡°Ô º¸³»¾ß ÇÑ´Ù. Reactor ÆÐÅÏÀº ¹Ù·Î ÀÌ ±â´ÉÀ» ¼öÇàÇÑ´Ù. Reactor ÆÐÅÏÀº À̺¥Æ® Á᫐ ¾ÖÇø®ÄÉÀ̼ÇÀÌ Çϳª ȤÀº ¿©·¯ Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î µ¿½Ã¿¡ Àü´ÞµÇ´Â ¼­ºñ½º ¿äûµéÀ» ³ª´©¾î Àü¼ÛÇϵµ·Ï ÇÑ´Ù.

Reactor ÆÐÅÏÀÇ ÇÙ½É ±â´É
  • À̺¥Æ® ³ª´©±â
  • À̺¥Æ®¸¦ »óÀÀÇÏ´Â À̺¥Æ® ó¸®ÀÚ¿¡°Ô º¸³»±â

Reactor ÆÐÅÏÀº ÀÌ·± Ãø¸é¿¡¼­ Observer ÆÐÅÏ°ú ¹ÐÁ¢ÇÏ°Ô °ü·ÃµÇ¾î ÀÖ´Ù: ÇϳªÀÇ ÁÖÁ¦°¡ º¯°æµÇ¸é ÀÌ¿¡ °ü·ÃµÈ ¸ðµç ¿ä¼Òµé¿¡°Ô ÀÌ »ç½ÇÀÌ ¾Ë·ÁÁø´Ù. ±×·¯³ª Observer ÆÐÅÏÀº ÇÑ °÷ÀÇ À̺¥Æ®¿Í °ü·ÃµÇ¾î ÀÖ´Â ¹Ý¸é Reactor ÆÐÅÏÀº ¿©·¯ °÷ÀÇ À̺¥Æ®¿Í ¿¬°üµÇ¾î ÀÖ´Ù.

Reactor ÆÐÅÏ¿¡ ´ëÇÑ »ó¼¼ »çÇ×Àº Âü°íÀڷḦ ÂüÁ¶ÇÑ´Ù.

Channels°ú Selectors

NIOÀÇ nonblocking ÀÔÃâ·Â ¸ÞÄ¿´ÏÁòÀº selectors ¿Í channels¸¦ ±Ù°£À¸·Î ±¸ÃàµÇ¾ú´Ù. Channel Ŭ·¡½º´Â ¼­¹ö¿Í Ŭ¶óÀ̾ðÆ®°£ÀÇ Åë½Å ¸ÞÄ¿´ÏÁòÀ» ³ªÅ¸³½´Ù. Reactor ÆÐÅÏ¿¡¼­ º¸¸é Selector Ŭ·¡½º´Â Channels ÀÇ ´ÙÁßÈ­±â (multiplexor)¿¡ ÇØ´çÇÑ´Ù. Selector Ŭ·¡½º´Â µé¾î¿À´Â Ŭ¶óÀ̾ðÆ® ¿äûÀ» ³ª´©¾î °¢ ¿äû¿¡ ÇØ´çÇÏ´Â °¢°¢ÀÇ Ã³¸®ÀÚ¿¡°Ô À̵éÀ» º¸³½´Ù.

Channel Ŭ·¡½º¿Í Selector Ŭ·¡½ºÀÇ °¢°¢ÀÇ ±â´É°ú À̵éÀÌ Çù·ÂÇÏ¿© nonblocking ÀÔÃâ·ÂÀ» ¸¸µé¾î³»´Â ¹æ¹ýÀ» ÀÚ¼¼È÷ »ìÆ캸ÀÚ.

ä³ÎÀÇ ¿ªÇÒ
ä³ÎÀº Çϵå¿þ¾î Àåºñ, ÆÄÀÏ ,³×Æ®¿öÅ© ¼ÒÄÏ, ȤÀº ÇÁ·Î±×·¥ ÄÄÆ÷³ÍÆ®¿Í °°ÀÌ Àб⳪ ¾²±âµî ÇÑ °³ ÀÌ»óÀÇ ¶Ñ·ÇÇÑ ÀÔÃâ·Â ÀÛ¾÷À» ¼öÇàÇÒ ¼ö ÀÖ´Â ¿£ÅÍƼ¿¡ ´ëÇÑ °³¹æµÈ ¿¬°áÀ» ³ªÅ¸³½´Ù. NIO ä³ÎÀº ºñµ¿±âÀûÀ¸·Î ´ÝÈ÷°í Áß´Ü(interrupt)µÉ ¼ö ÀÖ´Ù. µû¶ó¼­ ÇÑ ½º·¹µå°¡ ÇÑ Ã¤³Î¿¡¼­ ÇϳªÀÇ ÀÔÃâ·Â ÀÛ¾÷À¸·Î ºí·ÏÈ­ÇÏ¸é ´Ù¸¥ ½º·¹µå°¡ ±× ä³ÎÀ» ´ÝÀ» ¼öµµ ÀÖ´Ù. ºñ½ÁÇÏ°Ô ÇÑ ½º·¹µå°¡ ÇÑ Ã¤³ÎÀÇ ÀÔÃâ·Â ÀÛ¾÷À¸·Î ºí·ÏÈ­µÇ¸é ´Ù¸¥ ½º·¹µå°¡ ºí·èÈ­µÈ ½º·¹µå¸¦ ÁߴܽÃų ¼ö ÀÖ´Ù.

±×¸² 2. java.nio.channelsÀÇ Å¬·¡½º °èÃþ
A class hierarchy diagram for the java.nio package

±×¸² 2¿¡ ³ªÅ¸³­ °Í°ú °°ÀÌ, java.nio.channels ÆÐÅ°Áö¿¡´Â ¸¹Àº ä³Î ÀÎÅÍÆäÀ̽º°¡ ÀÖ´Ù. ¿ì¸®´Â ÁÖ·Î java.nio.channels.SocketChannel°ú java.nio.channels.ServerSocketChannel ÀÎÅÍÆäÀ̽º¿¡ °ü½ÉÀÌ ÀÖ´Ù. ÀÌ Ã¤³ÎµéÀº °¢°¢ java.net.Socket°ú java.net.ServerSocketÀ» ´ëüÇÏ´Â °ÍÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù. ¿ì¸®´Â nonblocking ¸ðµå¿¡¼­ÀÇ Ã¤³Î »ç¿ë¿¡ ÃÊÁ¡À» ¸ÂÃß°í ÀÖÁö¸¸, ä³ÎÀº blocking°ú nonblocking ¸ðµå ¾çÂÊ¿¡¼­ »ç¿ëµÉ ¼ö ÀÖ´Ù.

nonblocking ä³Î »ý¼ºÇϱâ
±âº»ÀûÀÎ nonblocking ¹æ½ÄÀÇ ¼ÒÄÏ Àб⠾²±â ÀÛ¾÷À» ±¸ÇöÇϱâ À§ÇØ ¿ì¸®´Â µÎ °³ÀÇ »õ·Î¿î Ŭ·¡½º¸¦ ´Ù·ç¾î¾ß ÇÑ´Ù. java.net ÆÐÅ°Áö¿¡¼­ Á¦°øÇÏ´Â InetSocketAddress Ŭ·¡½º¿Í java.nio ä³Î ÆÐÅ°Áö¿¡¼­ Á¦°øÇÏ´Â SocketChannel Ŭ·¡½º°¡ ±×°ÍÀÌ´Ù. ÀüÀÚ´Â ¾îµð¿¡ Á¢¼ÓÇØ¾ß ÇÏ´ÂÁö¸¦ ÁöÁ¤ÇÏ°í, ÈÄÀÚ´Â ½ÇÁ¦ ÀÐ±â ¹× ¾²±â ÀÛ¾÷À» ¼öÇàÇÑ´Ù.

ÀÌ ¼½¼Ç¿¡ ³ª¿Í ÀÖ´Â ¿¹Á¦ ÄÚµå´Â ±âÃÊÀûÀÎ ¼­¹ö ¼ÒÄÏ ÇÁ·Î±×·¥À» °³¹ßÇϱâ À§ÇØ º¯°æµÈ nonbloking ¹æ½ÄÀ» º¸¿©ÁØ´Ù. µÎ °³ÀÇ »õ·Î¿î Ŭ·¡½º°¡ Ãß°¡µÈ °Í¿¡¼­ºÎÅÍ ½ÃÀÛÇÏ¿© ÀÌ »ùÇà ÄÚµåµé°ú ù¹ø° ¿¹Á¦¿¡¼­ »ç¿ëµÈ »ùÇà Äڵ尣ÀÇ Â÷ÀÌ¿¡ ÁÖ¸ñÇϱ⠹ٶõ´Ù.

 


String host = ......;
   InetSocketAddress socketAddress = new InetSocketAddress(host, 80);
	
SocketChannel channel = SocketChannel.open();
   channel.connect(socketAddress);

BufferÀÇ ¿ªÇÒ The role of the buffer
Buffer ´Â ƯÁ¤ÇÑ ¿ø½Ã µ¥ÀÌÅÍ À¯ÇüÀ¸·Î µÈ µ¥ÀÌÅ͸¦ °¡Áö°í ÀÖ´Â Ãß»ó Ŭ·¡½ºÀÌ´Ù. Buffer´Â ±âº»ÀûÀ¸·Î °íÁ¤µÈ Å©±âÀÇ ¹è¿­·Î µÈ WrapperÀÌ°í ÀÚ½ÅÀÇ ³»¿ëÀ» Á¢±Ù °¡´ÉÇϵµ·Ï ¸¸µå´Â getter/setter ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´Ù. Buffer Ŭ·¡½º´Â ´ÙÀ½°ú °°Àº ¸¹Àº ÇÏÀ§ Ŭ·¡½º¸¦ °¡Áø´Ù.

  • ByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

ByteBuffer´Â ´Ù¸¥ À¯Çü°úÀÇ ÀÐ±â ¹× ¾²±â¸¦ Áö¿øÇÏ´Â À¯ÀÏÇÑ Å¬·¡½ºÀÌ´Ù.´Ù¸¥ Ŭ·¡½ºµéÀº ƯÁ¤ À¯Çü¿¡ ÇÑÁ¤µÇ¾î Àֱ⠶§¹®ÀÌ´Ù. ÀÏ´Ü ¿¬°áµÇ¸é ByteBuffer °´Ã¼¸¦ ÀÌ¿ëÇØ Ã¤³Î¿¡¼­ µ¥ÀÌÅ͸¦ Àаųª ä³Î¿¡ µ¥ÀÌÅ͸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ByteBuffer¿¡ ´ëÇÑ »ó¼¼ Á¤º¸´Â Âü°íÀڷḦ ÂüÁ¶ÇÑ´Ù.

ä³ÎÀ» nonblockingÀ¸·Î ¸¸µé±â À§ÇØ ¿ì¸®´Â ´ÙÀ½°ú °°ÀÌ Ã¤³Î¿¡ configureBlockingMethod(false)¸¦ È£ÃâÇÑ´Ù.


channel.configureBlockingMethod(false);

blocking ¸ðµå¿¡¼­ ÇÑ ½º·¹µå´Â ÀÛ¾÷ÀÌ ¿Ï·áµÉ ¶§±îÁö Àб⳪ ¾²±â·Î ºí·ÏÈ­µÈ´Ù. Àб⠰úÁ¤ µ¿¾È µ¥ÀÌÅÍ°¡ ¼ÒÄÏ¿¡ ¿ÏÀüÈ÷ µµÂøÇÏÁö ¾ÊÀ¸¸é ½º·¹µå´Â ¸ðµç µ¥ÀÌÅ͸¦ ÀÌ¿ëÇÒ ¼ö ÀÖÀ» ¶§±îÁö Àбâ ÀÛ¾÷¿¡ ºí·ÏÈ­µÈ´Ù.

nonblocking ¸ðµå¿¡¼­ ½º·¹µå´Â µ¥ÀÌÅÍ ¾çÀÌ ¾ó¸¶°¡ µÇµç Àо°¥ °ÍÀÌ°í °á±¹ ´Ù¸¥ ÀÛ¾÷À» ¼öÇàÇϱâ À§Çؼ­ º¹±ÍÇÒ °ÍÀÌ´Ù. ¸¸ÀÏ configureBlockingMethod()°¡ ÂüÀ¸·Î Àü´ÞµÇ¸é, ä³ÎÀº Socket¿¡ ´ëÇØ blocking ¸ðµå¿¡¼­ÀÇ Àб⠾²±â ÀÛ¾÷°ú Á¤È®È÷ µ¿ÀÏÇÑ ÀÛ¾÷À» ¼öÇàÇÏ°Ô µÉ °ÍÀÌ´Ù. À§¿¡¼­ ¾ð±ÞÇßµíÀÌ ÇϳªÀÇ ÁÖ¿äÇÑ Â÷ÀÌ´Â ÀÌ·¯ÇÑ blocking¸ðµå¿¡¼­ÀÇ Àб⠾²±âµéÀº ´Ù¸¥ ½º·¹µå¿¡ ÀÇÇØ Áß´ÜµÉ ¼öµµ ÀÖ´Ù´Â °ÍÀÌ´Ù.

Channel ¸¸À¸·Î´Â nonblocking ÀÔÃâ·Â ±¸ÇöÀ» ¸¸µå´Â µ¥ ÃæºÐÇÏÁö ¾Ê´Ù. Channel Ŭ·¡½º´Â nonblocking ÀÔÃâ·ÂÀ» À§ÇØ Selector Ŭ·¡½º¿Í Çù·ÂÇÏ¿© ÀÛ¾÷ÇØ¾ß ÇÑ´Ù.

SelectorÀÇ ¿ªÇÒ

Selector Ŭ·¡½º´Â Reactor ÆÐÅÏ ½Ã³ª¸®¿À¿¡¼­ÀÇ Reactor ¿ªÇÒÀ» ¼öÇàÇÑ´Ù. Selector´Â À̺¥Æ®¸¦ ¿©·¯ SelectableChannels¿¡ ´ÙÁßÈ­ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®¿¡¼­ À̺¥Æ®°¡ µµÂøÇϸé Selector´Â À̵éÀ» ³ª´©¾î »óÀÀÇÏ´Â Channels¿¡ À̺¥Æ®¸¦ º¸³½´Ù.

Selector¸¦ »ý¼ºÇÏ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀº ¾Æ·¡¿Í °°ÀÌ open() ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.:


Selector selector = Selector.open();

ChannelÀÌ Selector¸¦ ¸¸³ª´Ù

Ŭ¶óÀ̾ðÆ® ¿äûÀ» ¼­ºñ½ºÇØ¾ß ÇÏ´Â °¢ ChannelÀº ¸ÕÀú ¿¬°áÀ» ±¸¼ºÇØ¾ß ÇÑ´Ù. ¾Æ·¡ ÄÚµå´Â Server¶ó´Â À̸§ÀÇ ServerSocketChannelÀ» ¸¸µé¾î À̸¦ ·ÎÄà Æ÷Æ®¿¡ ¿¬°á½ÃŲ´Ù:


ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
InetAddress ia = InetAddress.getLocalHost();
InetSocketAddress isa = new InetSocketAddress(ia, port );
serverChannel.socket().bind(isa);

Ŭ¶óÀ̾ðÆ® ¿äûÀ» ¼­ºñ½ºÇØ¾ß ÇÏ´Â °¢ ChannelÀº ´ÙÀ½¿¡ ÀÚ½ÅÀ» Selector¿¡ µî·ÏÇØ¾ß ÇÑ´Ù. ChannelÀº ÀÚ½ÅÀÌ Ã³¸®ÇÒ À̺¥Æ®¿¡ µû¶ó µî·ÏµÇ¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, Á¢¼ÓÀ» Á¢¼öÇØ¾ß ÇÏ´Â ChannelÀº ´ÙÀ½°ú °°ÀÌ µî·ÏµÇ¾î¾ß ÇÑ´Ù:


SelectionKey acceptKey = 
    channel.register( selector,SelectionKey.OP_ACCEPT);

ChannelÀÌ Selector¿¡ µî·ÏµÈ °ÍÀº SelectionKey °´Ã¼·Î Ç¥½ÃµÈ´Ù. ´ÙÀ½ ¼¼ Á¶°Ç Áß Çϳª°¡ ÃæÁ·µÉ ¶§±îÁö Key´Â À¯È¿ÇÏ´Ù:

  • ChannelÀÌ Á¾·áµÇ¾ú´Ù
  • Selector°¡ Á¾·áµÇ¾ú´Ù
  • Key ÀÚü°¡ ÀÚ½ÅÀÇ cancel() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© Ãë¼ÒµÇ¾ú´Ù. .

Selector´Â select() È£Ãâ¿¡ ºí·ÏÈ­µÈ´Ù. ±×¸®°í »õ·Î¿î ¿¬°áÀÌ ÀÌ·ç¾îÁ® ´Ù¸¥ ½º·¹µå°¡ ÀÚ½ÅÀ» ±ú¿ì°Å³ª ´Ù¸¥ ½º·¹µå°¡ ¿ø·¡ÀÇ ºí·ÏÈ­µÈ ½º·¹µå¸¦ ÁߴܽÃų ¶§±îÁö ±â´Ù¸°´Ù.

¼­¹ö µî·ÏÇϱâ

Server´Â ¾Æ·¡¿¡¼­ º¸¿©Áöµí µé¾î¿À´Â ¸ðµç ¿¬°áÀ» ¹Þ¾ÆµéÀ̱â À§ÇÏ¿© Selector¿¡ ÀÚ½ÅÀ» µî·ÏÇÏ´Â ServerSocketChannelÀ» ¸»ÇÑ´Ù.


SelectionKey acceptKey = serverChannel.register(sel, SelectionKey.OP_ACCEPT);

   while (acceptKey.selector().select() > 0 ){

     ......

Server°¡ µî·ÏµÇ°í ³ª¸é ¿ì¸®´Â Key ¼¼Æ®¸¦ ¹Ýº¹ Àû¿ëÇÏ¿© °¢°¢À» ±× À¯Çü¿¡ µû¶ó ó¸®ÇÑ´Ù. Key°¡ ó¸®µÈ ÈÄ¿¡ ±× key´Â ´ë±â key ¸ñ·Ï¿¡¼­ »èÁ¦µÇ´Âµ¥, ÀÌ´Â ´ÙÀ½°ú °°´Ù:


Set readyKeys = sel.selectedKeys();
    Iterator it = readyKeys.iterator();
while (it.hasNext()) 
{

SelectionKey key = (SelectionKey)it.next();
  it.remove();
  ....
  ....
  ....
 }

Key°¡ ¹Þ¾Æµé¿©Áú ¼ö ÀÖÀ¸¸é ¿¬°áÀº ¹Þ¾Æµé¿©Áö¸ç ä³ÎÀº Àб⳪ ¾²±â ÀÛ¾÷°ú °°Àº ÇâÈÄÀÇ À̺¥Æ®¿¡ µî·ÏµÇ¾îÁø´Ù. Key°¡ Àб⠰¡´ÉÇϰųª ¾²±â °¡´ÉÇϸé, ¼­¹ö´Â ±× ¸»¹Ì¿¡ µ¥ÀÌÅ͸¦ Àаųª ¾µ Áغñ°¡ µÇ¾ú´Ù°í Ç¥½ÃÇÑ´Ù.


SocketChannel socket;
if (key.isAcceptable()) {
    System.out.println("Acceptable Key");
    ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
    socket = (SocketChannel) ssc.accept();
    socket.configureBlocking(false);
    SelectionKey another = 
      socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE);
}
if (key.isReadable()) {
    System.out.println("Readable Key");
    String ret = readMessage(key);
    if (ret.length() > 0) {
      writeMessage(socket,ret);
    }
		    
}
if (key.isWritable()) {
    System.out.println("Writable Key");
    String ret = readMessage(key);
    socket = (SocketChannel)key.channel();   
    if (result.length() > 0 ) {
      writeMessage(socket,ret);
    }
    }

¾Æºê¶óÄ«´Ùºê¶ó - nonblocking ¼­¹ö ¼ÒÄÏÀÌ ³ªÅ¸³ª¶ó, º!

JDK 1.4¿¡¼­ÀÇ nonbloking ÀÔÃâ·Â¿¡ ´ëÇÑ ÀÌ ¼Ò°³±ÛÀÇ ¸¶Áö¸· ºÎºÐÀº ¿©·¯ºÐÀÇ ¸òÀÌ´Ù. : ¹Ù·Î ¿¹Á¦¸¦ ½ÇÇà½ÃÅ°´Â °ÍÀÌ´Ù.

ÀÌ °£´ÜÇÑ nonblocking ¼­¹ö ¼ÒÄÏÀÇ ¿¹¿¡¼­ ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®¿¡¼­ º¸³½ ÆÄÀϸíÀ» Àаí ÆÄÀÏ ³»¿ëÀ» È­¸éÃâ·ÂÇÏ¸ç ³»¿ëÀ» ÀÛ¼ºÇÏ¿© Ŭ¶óÀ̾ðÆ®¿¡°Ô ´Ù½Ã º¸³½´Ù.

ÀÌ ¿¹Á¦¸¦ ½ÇÇà½ÃÅ°·Á¸é ´ÙÀ½°ú °°Àº °ÍÀÌ ÇÊ¿äÇÏ´Ù:

  1. Install JDK 1.4¸¦ ¼³Ä¡ÇÑ´Ù. (Âü°í ÀÚ·á)

  2. µÎ ¼Ò½º ÆÄÀÏ À» ¿©·¯ºÐ µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.

  3. java NonBlockingServer·Î ¼­¹ö¸¦ ÄÄÆÄÀÏÇÏ°í ½ÇÇà½ÃŲ´Ù.

  4. java Client·Î Ŭ¶óÀ̾ðÆ®¸¦ ÄÄÆÄÀÏÇÏ°í ½ÇÇà½ÃŲ´Ù.

  5. Ŭ·¡½º ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¿¡ ÅؽºÆ®³ª ÀÚ¹Ù ÆÄÀϸíÀ» ÀÔ·ÂÇÑ´Ù.

  6. ¼­¹ö´Â ÆÄÀÏÀ» ÀÐ°í ±× ³»¿ëÀ» Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³½´Ù.

  7. Ŭ¶óÀ̾ðÆ®´Â ¼­¹ö¿¡°Ô¼­ ¹ÞÀº µ¥ÀÌÅ͸¦ Ãâ·ÂÇÑ´Ù. (»ç¿ëµÈ ByteBufferÀÇ Á¦ÇÑ ¶§¹®¿¡ 1024 ¹ÙÀÌÆ®¸¸ ÀÐÈú °ÍÀÌ´Ù)

  8. Á¾·á ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© Ŭ¶óÀ̾ðÆ®¸¦ Á¾·á½ÃŲ´Ù.

°á·Ð
MerlinÀÌ Á¦°øÇÏ´Â »õ·Î¿î ÀÔÃâ·Â ÆÐÅ°Áö´Â ±¤¹üÀ§ÇÑ ºÐ¾ß¸¦ ´Ù·é´Ù. MerlinÀÇ »õ·Î¿î nonblocking ÀÔÃâ·Â ±¸ÇöÀÇ ÁÖ¿ä ÀåÁ¡Àº µÎ ºÎºÐÀÌ´Ù. ½º·¹µå´Â ´õ ÀÌ»ó Àб⳪ ¾²±â¿¡ ºí·ÏÈ­µÇÁö ¾Ê°í, Selector´Â º¹¼öÀÇ Á¢¼ÓÀ» ó¸®ÇÒ ¼ö ÀÖ¾î ¼­¹ö ¾ÖÇø®ÄÉÀ̼ÇÀÇ ºÎÇÏ°¡ »ó´çÈ÷ ÁÙ¾îµç´Ù.

¿ì¸®´Â »õ·Î¿î java.nio ÆÐÅ°ÁöÀÇ ÀÌ µÎ ÁÖ¿ä ÀåÁ¡À» °­Á¶ÇÏ¿´´Ù. ¿ì¸®´Â ¿©·¯ºÐÀÌ ¿©±â¿¡¼­ ¹è¿î °ÍÀ» ¿©·¯ºÐÀÇ ½ÇÁ¦ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß ÀÛ¾÷¿¡ Àû¿ëÇϱ⸦ ¹Ù¶õ´Ù.

Âü°í ÀÚ·á

¸ñ Â÷:
Merlin ÀÌÀüÀÇ ÀÔÃâ·Â ÇÁ·Î±×·¡¹Ö
Reactor ÆÐÅÏ
Channels°ú Selectors
¾Æºê¶óÄ«´Ùºê¶ó - nonblocking ÀÔÃâ·ÂÀÌ ³ªÅ¸³ª¶ó, º
°á·Ð
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
Java design patterns 101
Java sockets 101
Magic with Merlin
Subscribe to the developerWorks newsletter
US ¿ø¹® Àбâ
Also in the Java zone:
Tutorials
Tools and products
Code and components
Articles
ÇÊÀÚ¼Ò°³
Aruna Kalagnanam´Â IBM India labs¿¡¼­ e-ºñÁî´Ï½º ÅëÇÕ ±â¼ú ºÎ¹®ÀÇ ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î·Î ÀÏÇÏ°í ÀÖ´Ù.


Balu G´Â IBM India labs¿¡¼­ e-ºñÁî´Ï½º ÅëÇÕ ±â¼ú ºÎ¹®ÀÇ ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î·Î ÀÏÇÏ°í ÀÖ´Ù.

ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ