»õ·Ó°Ô Ãß°¡µÈ ±â´Éµé
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. ÀÛµ¿ÁßÀÎ ÀÏ¹Ý ¼¹ö
JDK 1.4 ÀÌÀü¿¡´Â ½º·¹µå¸¦ ÀÚÀ¯·Ó°Ô »ç¿ëÇÏ´Â °ÍÀÌ ºí·Ïȸ¦ ÇÇÇÏ´Â
°¡Àå ÀϹÝÀûÀÎ ¹æ½ÄÀ̾ú´Ù. ±×·¯³ª ÀÌ ¼Ö·ç¼ÇÀº ½º·¹µå °úºÎÇ϶ó´Â ¹®Á¦¸¦ ÀÏÀ¸Ä״µ¥, ÀÌ´Â ¼º´É°ú È®À强 ¾çÂÊ¿¡
¿µÇâÀ» ¹ÌÃÆ´Ù. ±×·¯³ª Merlin°ú java.nio ÆÐÅ°Áö°¡ ³ª¿È¿¡ µû¶ó ¸ðµç °ÍÀÌ
º¯ÈµÇ¾ú´Ù.
À̾îÁö´Â ¼½¼Çµé¿¡¼´Â java.nioÀÇ ±âÃÊ »çÇ×µéÀ» »ìÆ캸°í, À§¿¡¼
¼³¸íÇÑ ¼¹ö ¼ÒÄÏ ¿¹Á¦¸¦ ¼öÁ¤Çϴµ¥ ¿ì¸®°¡ ¹è¿î °Í Áß ÀϺθ¦ Àû¿ëÇØ º¸°Ú´Ù.
Reactor ÆÐÅÏ
NIO ¼³°è µÚ¿¡ ÀÖ´Â ÁÖµÈ ÈûÀº Reactor ÆÐÅÏÀÌ´Ù. ºÐ»ê
½Ã½ºÅÛ¿¡¼ ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀº ¼ºñ½º ¿äûÀ» º¸³»´Â ¿©·¯ Ŭ¶óÀ̾ðÆ®¸¦ ó¸®ÇØ¾ß ÇÑ´Ù. ±×·¯³ª ƯÁ¤ ¼ºñ½º¸¦
È£ÃâÇϱâ Àü¿¡ ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀº µé¾î ¿À´Â °¢ ¿äûÀ» ³ª´©¾î »óÀÀÇÏ´Â ¼ºñ½º Á¦°øÀÚ¿¡°Ô º¸³»¾ß ÇÑ´Ù.
Reactor ÆÐÅÏÀº ¹Ù·Î ÀÌ ±â´ÉÀ» ¼öÇàÇÑ´Ù. Reactor ÆÐÅÏÀº À̺¥Æ® Á᫐ ¾ÖÇø®ÄÉÀ̼ÇÀÌ Çϳª ȤÀº ¿©·¯
Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ ÇÑ ¾ÖÇø®ÄÉÀ̼ÇÀ¸·Î µ¿½Ã¿¡ Àü´ÞµÇ´Â ¼ºñ½º ¿äûµéÀ» ³ª´©¾î Àü¼ÛÇϵµ·Ï ÇÑ´Ù.
Reactor ÆÐÅÏÀº ÀÌ·± Ãø¸é¿¡¼ Observer ÆÐÅÏ°ú ¹ÐÁ¢ÇÏ°Ô
°ü·ÃµÇ¾î ÀÖ´Ù: ÇϳªÀÇ ÁÖÁ¦°¡ º¯°æµÇ¸é ÀÌ¿¡ °ü·ÃµÈ ¸ðµç ¿ä¼Òµé¿¡°Ô ÀÌ »ç½ÇÀÌ ¾Ë·ÁÁø´Ù. ±×·¯³ª Observer
ÆÐÅÏÀº ÇÑ °÷ÀÇ À̺¥Æ®¿Í °ü·ÃµÇ¾î ÀÖ´Â ¹Ý¸é Reactor ÆÐÅÏÀº ¿©·¯ °÷ÀÇ À̺¥Æ®¿Í ¿¬°üµÇ¾î ÀÖ´Ù.
Reactor ÆÐÅÏ¿¡ ´ëÇÑ »ó¼¼ »çÇ×Àº Âü°íÀڷḦ
ÂüÁ¶ÇÑ´Ù.
Channels°ú
Selectors
NIOÀÇ nonblocking ÀÔÃâ·Â ¸ÞÄ¿´ÏÁòÀº selectors ¿Í
channels¸¦ ±Ù°£À¸·Î ±¸ÃàµÇ¾ú´Ù. Channel Ŭ·¡½º´Â ¼¹ö¿Í
Ŭ¶óÀ̾ðÆ®°£ÀÇ Åë½Å ¸ÞÄ¿´ÏÁòÀ» ³ªÅ¸³½´Ù. Reactor ÆÐÅÏ¿¡¼
º¸¸é Selector Ŭ·¡½º´Â
Channel s ÀÇ ´ÙÁßȱâ (multiplexor)¿¡ ÇØ´çÇÑ´Ù. Selector Ŭ·¡½º´Â µé¾î¿À´Â Ŭ¶óÀ̾ðÆ® ¿äûÀ» ³ª´©¾î °¢
¿äû¿¡ ÇØ´çÇÏ´Â °¢°¢ÀÇ Ã³¸®ÀÚ¿¡°Ô À̵éÀ» º¸³½´Ù.
Channel Ŭ·¡½º¿Í Selector Ŭ·¡½ºÀÇ °¢°¢ÀÇ
±â´É°ú À̵éÀÌ Çù·ÂÇÏ¿© nonblocking ÀÔÃâ·ÂÀ» ¸¸µé¾î³»´Â ¹æ¹ýÀ» ÀÚ¼¼È÷ »ìÆ캸ÀÚ.
ä³ÎÀÇ ¿ªÇÒ Ã¤³ÎÀº Çϵå¿þ¾î
Àåºñ, ÆÄÀÏ ,³×Æ®¿öÅ© ¼ÒÄÏ, ȤÀº ÇÁ·Î±×·¥ ÄÄÆ÷³ÍÆ®¿Í °°ÀÌ Àб⳪ ¾²±âµî ÇÑ °³ ÀÌ»óÀÇ ¶Ñ·ÇÇÑ ÀÔÃâ·Â ÀÛ¾÷À»
¼öÇàÇÒ ¼ö ÀÖ´Â ¿£ÅÍƼ¿¡ ´ëÇÑ °³¹æµÈ ¿¬°áÀ» ³ªÅ¸³½´Ù. NIO ä³ÎÀº ºñµ¿±âÀûÀ¸·Î ´ÝÈ÷°í
Áß´Ü(interrupt)µÉ ¼ö ÀÖ´Ù. µû¶ó¼ ÇÑ ½º·¹µå°¡ ÇÑ Ã¤³Î¿¡¼ ÇϳªÀÇ ÀÔÃâ·Â ÀÛ¾÷À¸·Î ºí·ÏÈÇÏ¸é ´Ù¸¥
½º·¹µå°¡ ±× ä³ÎÀ» ´ÝÀ» ¼öµµ ÀÖ´Ù. ºñ½ÁÇÏ°Ô ÇÑ ½º·¹µå°¡ ÇÑ Ã¤³ÎÀÇ ÀÔÃâ·Â ÀÛ¾÷À¸·Î ºí·ÏÈµÇ¸é ´Ù¸¥ ½º·¹µå°¡
ºí·èÈµÈ ½º·¹µå¸¦ ÁߴܽÃų ¼ö ÀÖ´Ù.
±×¸² 2. java.nio.channelsÀÇ Å¬·¡½º °èÃþ
±×¸² 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 ´Â À̵éÀ» ³ª´©¾î »óÀÀÇÏ´Â Channel s¿¡ À̺¥Æ®¸¦
º¸³½´Ù.
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 ¼¹ö ¼ÒÄÏÀÇ ¿¹¿¡¼ ¼¹ö´Â Ŭ¶óÀ̾ðÆ®¿¡¼ º¸³½ ÆÄÀϸíÀ» Àаí ÆÄÀÏ ³»¿ëÀ»
ȸéÃâ·ÂÇÏ¸ç ³»¿ëÀ» ÀÛ¼ºÇÏ¿© Ŭ¶óÀ̾ðÆ®¿¡°Ô ´Ù½Ã º¸³½´Ù.
ÀÌ ¿¹Á¦¸¦ ½ÇÇà½ÃÅ°·Á¸é ´ÙÀ½°ú °°Àº °ÍÀÌ ÇÊ¿äÇÏ´Ù:
- Install JDK 1.4¸¦ ¼³Ä¡ÇÑ´Ù. (Âü°í
ÀÚ·á)
- µÎ ¼Ò½º
ÆÄÀÏ À» ¿©·¯ºÐ µð·ºÅ丮¿¡ º¹»çÇÑ´Ù.
- java NonBlockingServer·Î ¼¹ö¸¦ ÄÄÆÄÀÏÇÏ°í ½ÇÇà½ÃŲ´Ù.
- java Client·Î Ŭ¶óÀ̾ðÆ®¸¦ ÄÄÆÄÀÏÇÏ°í ½ÇÇà½ÃŲ´Ù.
- Ŭ·¡½º ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¿¡ ÅؽºÆ®³ª ÀÚ¹Ù ÆÄÀϸíÀ» ÀÔ·ÂÇÑ´Ù.
- ¼¹ö´Â ÆÄÀÏÀ» ÀÐ°í ±× ³»¿ëÀ» Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³½´Ù.
- Ŭ¶óÀ̾ðÆ®´Â ¼¹ö¿¡°Ô¼ ¹ÞÀº µ¥ÀÌÅ͸¦ Ãâ·ÂÇÑ´Ù. (
»ç¿ëµÈ ByteBufferÀÇ Á¦ÇÑ
¶§¹®¿¡ 1024 ¹ÙÀÌÆ®¸¸ ÀÐÈú °ÍÀÌ´Ù)
- Á¾·á ¸í·É¾î¸¦ ÀÔ·ÂÇÏ¿© Ŭ¶óÀ̾ðÆ®¸¦ Á¾·á½ÃŲ´Ù.
°á·Ð MerlinÀÌ
Á¦°øÇÏ´Â »õ·Î¿î ÀÔÃâ·Â ÆÐÅ°Áö´Â ±¤¹üÀ§ÇÑ ºÐ¾ß¸¦ ´Ù·é´Ù. MerlinÀÇ »õ·Î¿î nonblocking ÀÔÃâ·Â
±¸ÇöÀÇ ÁÖ¿ä ÀåÁ¡Àº µÎ ºÎºÐÀÌ´Ù. ½º·¹µå´Â ´õ ÀÌ»ó Àб⳪ ¾²±â¿¡ ºí·ÏȵÇÁö ¾Ê°í,
Selector ´Â º¹¼öÀÇ Á¢¼ÓÀ» ó¸®ÇÒ ¼ö ÀÖ¾î ¼¹ö ¾ÖÇø®ÄÉÀ̼ÇÀÇ ºÎÇÏ°¡ »ó´çÈ÷
ÁÙ¾îµç´Ù.
¿ì¸®´Â »õ·Î¿î java.nio ÆÐÅ°ÁöÀÇ ÀÌ µÎ ÁÖ¿ä ÀåÁ¡À» °Á¶ÇÏ¿´´Ù. ¿ì¸®´Â ¿©·¯ºÐÀÌ ¿©±â¿¡¼ ¹è¿î °ÍÀ»
¿©·¯ºÐÀÇ ½ÇÁ¦ ¾ÖÇø®ÄÉÀÌ¼Ç °³¹ß ÀÛ¾÷¿¡ Àû¿ëÇϱ⸦ ¹Ù¶õ´Ù.
Âü°í ÀÚ·á
|