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

The practice of peer-to-peer computing : IP ¸ÖƼij½ºÆ® ±â¹ÝÀÇ °Ë»ö
¸ñ Â÷:
°Ë»ö ¹æ½Ä¿¡ ´ëÇÑ º¹½À
IP ¸ÖƼij½ºÆ®¸¦ ÀÌ¿ëÇÑ °Ë»ö
°£´ÜÇÑ Å¬¶óÀ̾ðÆ®¿Í ¼­¹ö
°Ë»ö ÄÄÆ÷³ÍÆ®
¸â¹ö Ŭ·¡½º
P2P ¾ÖÇø®ÄÉÀ̼Ç
°á·Ð
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
The practice of peer-to-peer computing : °Ë»ö
P2P¸¦ ¾ç¹æÇâÀ¸·Î ¸¸µé±â : The Jxta story
P2P¸¦ ¾ç¹æÇâÀ¸·Î ¸¸µé±â : Jxta ¸í·É½©
P2P¸¦ ¾ç¹æÇâÀ¸·Î ¸¸µé±â : Jxta ½Ã½ºÅÛ ±¸ÃàÇϱâ
US ¿ø¹® Àбâ
peer °Ë»öÀ» À§ÇÑ °£´ÜÇÑ ÇÁ·¹ÀÓ¿öÅ© ±¸ÃàÇϱâ


Todd E. Sundsted
ºÎ»çÀå, Facilitation, Etcee LLC
2002³â 2¿ù

P2P ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇǾî(peer)µéÀº À¯¿ëÇÑ ÀÛ¾÷À» ¼öÇàÇϱâ À§ÇØ ¼­·Î¸¦ ¹ß°ßÇÏ°í »óÈ£ÀÛ¿ëÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. Todd´Â ÀÌ ±Û¿¡¼­ ÇǾîµéÀÌ ¼­·Î¸¦ °Ë»öÇϴµ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â ¸î °¡Áö ´Ù¸¥ ¸ÞÄ¿´ÏÁòÀ» ±â¼úÇÏ°í °¢°¢ÀÇ Àå´ÜÁ¡À» ¼³¸íÇÏ¿´´Ù. À̹ø ´Þ¿¡´Â IP ¸ÖƼij½ºÆ®¿¡ ±â¹ÝÇÏ¿© °Ë»öÀ» ±¸ÇöÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù.

ÇÑ ¼ÒÇÁÆ®¿þ¾î ¿£ÅÍƼ°¡ P2P ¾ÖÇø®ÄÉÀ̼ÇÀ» Ư¡Áþ´Â Á÷Á¢ÀûÀÎ ÇǾ »óÈ£ÀÛ¿ë¿¡ Âü°¡ÇÏ·Á¸é ±× Àü¿¡ »óÈ£ÀÛ¿ëÇÒ ÀûÇÕÇÑ ÇǾ °Ë»öÇØ¾ß ÇÑ´Ù. ¸ðµç ½ÇÇà °¡´ÉÇÑ P2P ¾ÆÅ°ÅØó´Â °Ë»ö ¹®Á¦¿¡ ´ëÇÑ ¼Ö·ç¼ÇÀ» Á¦°øÇÑ´Ù. Áö³­ ȸ¿¡¼­ ¿ì¸®´Â °Ë»öÀ» ±¸ÇöÇÏ´Â ¸î °¡Áö ´Ù¸¥ ¹æ½ÄµéÀ» ¾Ë¾Æ º¸¾Ò´Ù. À̹ø ´Þ¿¡´Â ±× ¸ÞÄ¿´ÏÁò Áß Çϳª¸¦ ±¸ÇöÇÏ´Â °Í¿¡ °üÇØ ¼³¸íÇÏ°Ú´Ù. º¹½ÀºÎÅÍ Çغ¸ÀÚ

°Ë»ö ¹æ½Ä¿¡ ´ëÇÑ º¹½À

ÇÇ¾î °Ë»öÀº P2P ¾ÖÇø®ÄÉÀ̼ÇÀÇ ÇǾîµéÀÌ »óÈ£ÀÛ¿ëÇϱâ À§ÇØ ¼­·Î¸¦ ã°Ô ÇØÁØ´Ù. ÇÇ¾î °Ë»ö ¼­ºñ½º¸¦ ±¸ÇöÇϴµ¥´Â ¸¹Àº ¹æ½ÄÀÌ ÀÖ´Ù. °¡Àå °£´ÜÇÑ ¸ÞÄ¿´ÏÁòÀº ºÐ¸íÇÑ Æ÷ÀÎÆ® ´ë Æ÷ÀÎÆ® ±¸¼ºÀÌ´Ù. ÀÌ ¸ÞÄ¿´ÏÁò¿¡¼­´Â ¸ðµç ÇǾ »óÈ£ ÀÛ¿ëÇÒ ´Ù¸¥ ¸ðµç ÇǾ ´ëÇؼ­ ¾Ë°í ÀÖ°í ¿¬°áµÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. Æ÷ÀÎÆ® ´ë Æ÷ÀÎÆ® ±¸¼ºÀÇ ÁÖµÈ ÀåÁ¡Àº °£Æí¼ºÀÌ´Ù. °¡Àå Å« ´ÜÁ¡Àº À¯¿¬¼ºÀÌ ºÎÁ·ÇÏ´Ù´Â °Í°ú ´ë´ÜÀ§ ÇÇ¾î ³×Æ®¿öÅ©·Î È®ÀåµÉ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù.

¶Ç´Ù¸¥ ÀϹÝÀûÀÎ °Ë»ö ¸ðµ¨Àº Áß¾Ó µð·ºÅ丮°¡ Áß°³ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¸ðµ¨Àº ±âÁ¸ÀÇ non-P2P ºÐ»ê ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸¹Àº À¯Çüµé¿¡¼­ ¸Å¿ì Àαâ ÀÖ°í, ±× ÀåÁ¡ÀÌ Àß ÀÌÇصǰí ÀÖ´Ù. ÇǾîµéÀº Áß¾Ó µð·ºÅ丮¿¡ ÀÚ½ÅÀÇ Á¸À縦 µî·ÏÇÏ°í, Áß¾Ó µð·ºÅ丮¸¦ ÀÌ¿ëÇÏ¿© ´Ù¸¥ ÇǾîÀÇ À§Ä¡¸¦ ã´Â´Ù. ÀÌ ¸ðµ¨ÀÇ ÁÖµÈ ÀåÁ¡Àº °ü¸®ÀÇ ¿ëÀ̼º°ú È®À强ÀÌ´Ù. ±×·¯³ª Áß¾Ó ÁýÁßÇü ¼³°è´Â ´ÜÀÏ Àå¾Ö ÁöÁ¡À̶ó´Â À§ÇèÀÌ µµ»ç¸®°í ÀÖ¾î ÀÚ¿¬ ÀçÇسª ÀÎÅͳÝÀ» ¼­ÇÎÇÏ°í ´Ù´Ï´Â ¸¹Àº ¾óÄ¡±âµé·ÎºÎÅÍ ÇÇÇظ¦ ¹Þ±â ½±´Ù.

Áß¾Ó µð·ºÅ丮¸¦ »ç¿ëÇÏ´Â ´ë½Å, ¸¹Àº Àαâ ÀÖ´Â P2P ¾ÖÇø®ÄÉÀ̼ǵéÀº ÇÑ ÇǾ ³×Æ®¿öÅ©ÀÇ ·ÎÄà Áö¿ª¿¡ ÀÖ´Â ÇǾîµéÀÇ ½Å¿ø¸¸ ¾Æ´Â ³×Æ®¿öÅ© ¸ðµ¨À» »ç¿ëÇÏ°í ÀÖ´Ù. °¢ ÇǾî´Â ÀÚ½ÅÀÌ ¿¬°áµÇ¾î ÀÖ´Â ÇǾîµé¿¡ ´ëÇÑ ÇϳªÀÇ µð·ºÅ丮·Î½á ÀÛµ¿ÇÑ´Ù. ÇǾîµéÀº ÀÎÁ¢ÇÑ ÇǾîµé¿¡°Ô µð·ºÅ丮 Á¶È¸ ¿äûÀ» Àü´ÞÇÏ°í °ü·ÃµÈ ÀÀ´äÀ» ¹ÝȯÇÔÀ¸·Î½á ¼­·Î Çù·ÂÇÑ´Ù. ÀÌ ¸ðµ¨ÀÇ ÁÖµÈ ÀåÁ¡Àº ´ú Áß¾ÓÁýÁßÈ­µÇ¾î ÀÖ´Ù´Â °ÍÀÌ°í, ÁÖ¿ä ´ÜÁ¡À¸·Î´Â Á¶È¸µéÀ» Àü´ÞÇÔÀ¸·Î½á ¸¹Àº ¾çÀÇ ³×Æ®¿öÅ© ÀÚ¿ø°ú ó¸® ´É·ÂÀÌ ¼Ò¸ðµÈ´Ù´Â Á¡ÀÌ´Ù.

À§ ¼¼ ¸ÞÄ¿´ÏÁò¿¡ ´ëÇØ ¼ö ¸¹Àº º¯ÇüµéÀÌ ÀÖ´Ù. ÀÌ º¯ÇüµéÀ» °ËÅäÇϱ⺸´Ù´Â ¾ÕÀ¸·Î ´õ ³ª¾Æ°¡ ´Ù¸¥ °Ë»ö ¸ÞÄ¿´ÏÁòÀ» »ìÆì º¸µµ·Ï ÇÏÀÚ.

IP ¸ÖƼij½ºÆ®¸¦ ÀÌ¿ëÇÑ °Ë»ö

¸ÖƼij½ºÆ® ¸ðµ¨Àº °¢ ÇǾ ÀÚüÀûÀÎ µð·ºÅ丮¸¦ À¯ÁöÇÑ´Ù´Â Á¡¿¡¼­ ³×Æ®¿öÅ© ¸ðµ¨°ú À¯»çÇÏ´Ù. ±×·¯³ª ÇǾîµéÀº ³×Æ®¿öÅ© ÀüüÀûÀÎ ´ë±Ô¸ð °Ë»öÀ» ¼öÇàÇϱâ À§ÇØ Çù·ÂÇÏÁö ¾Ê´Â´Ù. ¶ÇÇÑ ÇǾîµéÀº ´Ù¸¥ ÇǾîµéÀ» ã°í È®ÀÎÇϱâ À§ÇØ ³×Æ®¿öÅ© ÀÚü¿¡¼­ Á¦°øÇÑ ±â´ÉÀ» ÀÌ¿ëÇÑ´Ù. (IP ¸ÖƼij½ºÆ®)

IP ¸ÖƼij½ºÆ®´Â ºñÁ¢¼ÓÀûÀÌ°í ½Å·Ú¼ºÀÌ ¾ø´Ù (µÑ ´Ù¸¦ Áö¿øÇÏ´Â TCP/IP¿Í ´Ù¸£´Ù). IP ¸ÖƼij½ºÆ®´Â IP µ¥ÀÌÅͱ׷¥À» »ç¿ëÇÑ´Ù. ±×·¯³ª ÇÑ È£½ºÆ®¿¡¼­ ´Ù¸¥ ÇϳªÀÇ È£½ºÆ®·Î ÀüÇØÁö´Â À¯´Ïij½ºÆ® IP µ¥ÀÌÅͱ׷¥°ú´Â ´Þ¸® ¸ÖƼij½ºÆ® IP µ¥ÀÌÅͱ׷¥Àº ¿©·¯ °³ÀÇ È£½ºÆ®¿¡ µ¿½Ã¿¡ Àü¼ÛµÉ ¼ö ÀÖ´Ù.

ÇǾî´Â IP ¸ÖƼij½ºÆ®¸¦ »ç¿ëÇØ Á¤±âÀûÀ¸·Î ÀÚ½ÅÀÇ Á¸À縦 ¾Ë¸°´Ù. ¿©±â¿¡´Â È£½ºÆ®¸í°ú Á¤»óÀûÀÎ Åë½Å¿¡ »ç¿ëµÇ´Â Æ÷Æ®°¡ µé¾î ÀÖ´Ù. Èï¹Ì¸¦ °¡Áø ÇǾî´Â ÀÌ ¸Þ½ÃÁö¸¦ ÃßÀûÇÏ¿© È£½ºÆ®¸í°ú Æ÷Æ®¸¦ ÃßÃâÇÑ ÈÄ ÀÌ Á¤º¸¸¦ »ç¿ëÇÏ¿© Åë½Å ä³ÎÀ» ±¸ÃàÇÑ´Ù.

ÃæºÐÈ÷ º¹½ÀÇßÀ¸¹Ç·Î ÀÌÁ¦ Äڵ带 »ìÆ캸ÀÚ.

°£´ÜÇÑ Å¬¶óÀ̾ðÆ®¿Í ¼­¹ö

IP ¸ÖƼij½ºÆ®¸¦ »ç¿ëÇØ µÎ ÇÁ·Î¼¼½º°¡ ¾î¶»°Ô Åë½ÅÇÏ´ÂÁö¸¦ º¸¿©ÁÖ´Â °£´ÜÇÑ ¿¹Á¦·Î Ãâ¹ßÇØ º¸ÀÚ. ¼³¸íÀ» °£´ÜÇÏ°Ô Çϱâ À§ÇØ ³ª´Â ÀÌ ¿¹Á¦¸¦ Ŭ¶óÀ̾ðÆ® ÇÁ·Î¼¼½º¿Í ¼­¹ö ÇÁ·Î¼¼½ºÀÇ Ãø¸é¿¡¼­ ¼³¸íÇÏ°Ú´Ù. ÇϳªÀÇ P2P ¾ÖÇø®ÄÉÀ̼ÇÀº º¸Åë ¾ç ÇÁ·Î¼¼½º¸¦ ´Ù ±¸ÇöÇÏÁö¸¸, Ŭ¶óÀ̾ðÆ®, ȤÀº ¼­¹ö·Î ½±°Ô ºÐ·ùµÇÁö´Â ¾Ê´Â´Ù.

ÀÌ ¿¹Á¦¿¡¼­ ¼­¹ö ÇÁ·Î¼¼½º´Â ·çÇÁ ³»¿¡ ÀÖ°í µ¥ÀÌÅͱ׷¥ ÆÐŶÀÌ µµÂøÇϱ⸦ ±â´Ù¸°´Ù. °¢ ÆÐŶÀ» ¹ÞÀ¸¸é ¼­¹ö´Â ªÀº Áø´Ü ¸Þ½ÃÁö¸¦ Äֿܼ¡ Ãâ·ÂÇÑ´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ ¿ªÇÒÀº ´õ °£´ÜÇÏ´Ù. Ŭ¶óÀ̾ðÆ®´Â ÇϳªÀÇ µ¥ÀÌÅͱ׷¥ ÆÐŶÀ» ¸ÖƼij½ºÆ®ÇÑ ÈÄ ºüÁ® ³ª°£´Ù.

Listing 1°ú 2´Â ÀÌ µÎ ºÎºÐÀÌ ¾î¶»°Ô ¸ÂÃß¾îÁö´ÂÁö¸¦ º¸¿©ÁØ´Ù. ÄÚµå ³»ÀÇ ÄÚ¸àÆ®´Â ¹«½¼ ÀÏÀÌ ¹ß»ýÇÏ°í ÀÖ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.

Listing 1. °£´ÜÇÑ ¼­¹ö

public
class Server
{
  public
  static
  void
  main(String [] arstring)
  {
    try
    {
      // Create a multicast datagram socket for receiving IP
      //  multicast packets.  Join the multicast group at
      //  230.0.0.1, port 7777.
      MulticastSocket multicastSocket = new MulticastSocket(7777);
      InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
      multicastSocket.joinGroup(inetAddress);
      // Loop forever and receive messages from clients.  Print
      //  the received messages.
      while (true)
      {
        byte [] arb = new byte [100];
        DatagramPacket datagramPacket = new DatagramPacket(arb, arb.length);
        multicastSocket.receive(datagramPacket);
        System.out.println(new String(arb));
      }
    }
    catch (Exception exception)
    {
      exception.printStackTrace();
    }
  }
}

Listing 2. °£´ÜÇÑ Å¬¶óÀ̾ðÆ®

public
class Client
{
  public
  static
  void
  main(String [] arstring)
  {
    try
    {
      // Create a datagram package and send it to the multicast
      //  group at 230.0.0.1, port 7777.
      byte [] arb = new byte [] {'h','e','l','l','o'};
      InetAddress inetAddress = InetAddress.getByName("230.0.0.1");
      DatagramPacket datagramPacket = 
          new DatagramPacket(arb, arb.length, inetAddress, 7777);
      MulticastSocket multicastSocket = new MulticastSocket();
      multicastSocket.send(datagramPacket);
    }
    catch (Exception exception)
    {
      exception.printStackTrace();
    }
  }
}

java.net ÆÐÅ°Áö¿¡ µé¾î ÀÖ´Â µÎ Ŭ·¡½º°¡ À̸¦ ¼öÇàÇÑ´Ù. java.net.DatagramPacket Ŭ·¡½º´Â IP µ¥ÀÌÅͱ׷¥ ÆÐŶ¿¡ µé¾î ÀÖ´Â µ¥ÀÌÅ͸¦ °¡Áö°í ÀÖ´Ù. java.net.MulticastSocket Ŭ·¡½º´Â ƯÁ¤ ¸ÖƼij½ºÆ® ±×·ì¿¡ ¸ÂÃß¾îÁø ¸ÖƼij½ºÆ® ¼ÒÄÏÀ» »ý¼ºÇÑ´Ù.

°Ë»ö ÄÄÆ÷³ÍÆ®

À§ÀÇ ¿¹Á¦°¡ IP ¸ÖƼij½ºÆ®¸¦ Àß º¸¿©ÁÖ±ä ÇÏÁö¸¸, IP ¸ÖƼij½ºÆ® ±â¹ÝÀÇ ÇÇ¾î °Ë»öÀ» ±¸ÇöÇϱâ À§ÇØ ÇÊ¿äÇÑ °ÍÀÌ ¹«¾ùÀÎÁö¸¦ º¸¿©Áִµ¥´Â ºÎÁ·ÇÏ´Ù. À¯¿ëÇÏ°Ô µÇ·Á¸é °£´ÜÈ÷ ÆÐŶÀ» Àü¼ÛÇÏ°í ¹Þ´Â °Í ÀÌ»óÀ» ¼öÇàÇÏ´Â ¼ÒÇÁÆ®¿þ¾î ÄÄÆ÷³ÍÆ®°¡ ÇÊ¿äÇÏ´Ù. ÀÌ»óÀûÀ¸·Î ÀÌ ÄÄÆ÷³ÍÆ®´Â Àڽſ¡°Ô ÆÐŶÀ» º¸³½ ÇǾ ÃßÀûÇÏ°í, »ç¶óÁö°Å³ª ¾ø¾îÁ³´Ù°í »ý°¢µÇ´Â ÇǾ °üÇÑ Á¤º¸¸¦ Á¡ÁøÀûÀ¸·Î Æó±âÇÑ´Ù.

ÀÌ »õ·Î¿î ¼³°è¿¡¼­ ÇǾî´Â ¸ÖƼij½ºÆ® ±×·ìÀÇ ÇÑ ¸â¹öÀÌ´Ù. ¸ÖƼij½ºÆ® ±×·ì¿¡ Àü¼ÛµÈ ¸Þ½ÃÁö´Â ¸ÖƼij½ºÆ® ±×·ìÀÇ ¸ðµç ¸â¹öµé¿¡°Ô Åõ¸íÇÏ°Ô º¸³»Áø´Ù.

¼³°è´Â µÎ °³ÀÇ ÇÙ½É Å¬·¡½º¿Í ¼¼ °³ÀÇ ÀÎÅÍÆäÀ̽º (³ª´Â ´ëÃæ "ÀÎÅÍÆäÀ̽º"¶ó´Â ¿ë¾î¸¦ »ç¿ëÇߴµ¥, ±â¼úÀûÀ¸·Î ÇϳªÀÇ ÀÎÅÍÆäÀ̽º¿Í µÎ °³ÀÇ Ãß»ó Ŭ·¡½º°¡ ÀÖ´Ù.) Áß½ÉÀ¸·Î µÇ¾î ÀÖ´Ù. Member Ŭ·¡½ºÀÇ ÀνºÅϽº´Â ¸ÖƼij½ºÆ® ±×·ìÀÇ ÇÑ ¸â¹öÀÌ´Ù. ÀÌ Å¬·¡½º´Â Åë½Å°ú °ü·ÃµÈ ¸ðµç »ó¼¼»çÇ×À» ´Ù·é´Ù. ¸ÖƼij½ºÆ® ±×·ì¿¡ Âü°¡ÇÏ°í ÀÖ´Â ´Ù¸¥ ¸â¹ö¸¦ ÃßÀûÇϴµ¥ ÇÊ¿äÇÑ ÀÛ¾÷Àº MemberManager Ŭ·¡½ºÀÇ ÀνºÅϽºÀÇ Ã¥ÀÓÀÌ´Ù.

ÇǾî´Â ÇǾîµéÀÌ ¼ÓÇØ ÀÖ´Â ¸ÖƼij½ºÆ® ±×·ì¿¡°Ô ¸Þ½ÃÁö¸¦ º¸³»¾î ÀÚ½ÅÀ» ±× ÇÇ¾î ±×·ì¿¡°Ô ¾Ë¸°´Ù. °¢ ¸Þ½ÃÁö¿¡´Â ±×°ÍÀ» º¸³»´Â ÇǾ ´ëÇÑ Á¤º¸ --º¸Åë È£½ºÆ®¸í°ú Á¤»óÀûÀÎ(¹ß°ß°ú °ü·ÃµÇÁö ¾ÊÀº) Åë½Å¿¡ »ç¿ëµÇ´Â Æ÷Æ®-°¡ µé¾î ÀÖ´Ù. Member Ŭ·¡½º¿Í MemberManager Ŭ·¡½º´Â ÀÌ ¸Þ½ÃÁöµéÀÇ ³»¿ë¿¡ ´ëÇؼ­´Â °ÅÀÇ ¾ËÁö ¸øÇÑ´Ù. ±× Á¤º¸·ÎÀÇ Á¢±ÙÀº ÀÌ µÎ Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¸òÀÌ´Ù.

¼¼ °³ÀÇ ÀÎÅÍÆäÀ̽º´Â ¸Þ½Ã¡/°Ë»ö Ãþ°ú À̸¦ ÀÌ¿ëÇÏ´Â ¾ÖÇø®ÄÉÀÌ¼Ç Ãþ°£ÀÇ °æ°è¿¡ °ÉÃÄ ÀÖ´Ù. À̵éÀº Reference Ãß»ó Ŭ·¡½º, Message ÀÎÅÍÆäÀ̽º ¹× MessageFactory Ãß»ó Ŭ·¡½ºÀÌ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº ÀÌ ¼¼ ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀ» Á¦°øÇØ¾ß ÇÑ´Ù.

Reference Ãß»ó Ŭ·¡½º´Â ¸ÖƼij½ºÆ® ±×·ìÀÇ ¸â¹ö¿¡ ´ëÇÑ ÂüÁ¶¸¦ Á¤ÀÇÇÑ´Ù. MemberManager Ŭ·¡½º´Â ÂüÁ¶ ÁýÇÕÀ» °ü¸®ÇÑ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¿ä±¸ÇÏ´Â ÂüÁ¶ ·ÎÁ÷À» Æ÷ÇÔÇÏ°í ÀÖ´Â (·ÎÁ÷ÀÌ ¹«¾ùÀ̵çÀ̵簣¿¡) ÀÌ Å¬·¡½ºÀÇ ±¸Ã¼ÀûÀÎ ¹öÀüÀ» ±¸ÇöÇÒ °ÍÀÌ´Ù. Ŭ·¡½º´Â equalsInternal()°ú hashCodeInternal()¶ó´Â µÎ ¸Þ¼Òµå¸¦ Á¤ÀÇÇÏ°í À̵éÀ» È£ÃâÇϱâ À§ÇØ equals()°ú hashCode() ¸Þ¼Òµå¸¦ ÀçÁ¤ÀÇÇÑ´Ù. ÀÌ°ÍÀº ±¸ÇöÀÚ°¡ ÀÌ µÎ Áß¿äÇÑ ±â´É(MemberManager°¡ ÀÌ ¸Þ¼Òµåµé¿¡ ÀÇÁ¸ÇÑ´Ù)À» ±¸ÇöÇϵµ·Ï Çϱâ À§Çؼ­ÀÌ´Ù.

Message ÀÎÅÍÆäÀ̽º´Â ³×Æ®¿öÅ© ÄÚµå·Î ±³È¯µÇ´Â ¸Þ½ÃÁö µ¥ÀÌÅÍ°¡ ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ º¸¿©Áö´Â ÇüŸ¦ Á¤ÀÇÇÑ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀº ¸Þ½ÃÁö¸¦ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ½ÇÇàµÇ´Â ¿µ¿ª°ú °ü·ÃµÈ »óÀ§ °³³ä(È£½ºÆ®¸í°ú Æ÷Æ® °°Àº °³³ä)À¸·Î »ý°¢ÇÑ´Ù. ³×Æ®¿öÅ© ÄÚµå´Â ¹ÙÀÌÆ®·Î µÈ ÆÐŶÀ» Àü¼ÛÇϱ⸦ ¿øÇÑ´Ù. Message ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀº ÀÌ »óÀ§ Á¤º¸¸¦ ¹ÙÀÌÆ®·Î, ±×¸®°í ¹ÙÀÌÆ®¸¦ »óÀ§ Á¤º¸·Î º¯È¯ÇÏ´Â ¹æ¹ýÀ» Á¤ÀÇÇÑ´Ù. ÂüÁ¶´Â ¸ðµç ¸Þ½ÃÁö°¡ °¡Áö°í ÀÖ¾î¾ß ÇÏ´Â Áß¿äÇÑ ºÎºÐÀ̱⠶§¹®¿¡, ÀÎÅÍÆäÀ̽º´Â ±¸ÇöÀÌ reference¸¦ ÀÐ°í ¾²±â À§ÇÑ ¸Þ¼Òµå¸¦ Á¦°øÇÒ °ÍÀ» ¿ä±¸ÇÑ´Ù.

ÆÛÁñÀÇ ¸¶Áö¸· Á¶°¢Àº MessageFactory Ãß»ó Ŭ·¡½ºÀÌ´Ù. ÀÌ Å¬·¡½º´Â »õ·Î¿î Message ÀνºÅϽº°¡ »ý¼ºµÇ´Â ¸ÞÄ¿´ÏÁòÀ» Á¤ÀÇÇÑ´Ù. Member Ŭ·¡½º ³»¿¡ ±í¼÷È÷ ¼û°ÜÁ® ÀÖ´Â ³×Æ®¿öÅ© ÄÚµå´Â ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥À¸·ÎºÎÅÍ ÃßÃâÇÑ µ¥ÀÌÅÍ¿¡¼­ Message ÀνºÅϽº¸¦ »ý¼ºÇϱâ À§ÇØ factory¸¦ »ç¿ëÇÑ´Ù. ¸ðµç MessageFactory ÀνºÅϽº´Â ¹«ÀÛÀ§·Î »ý¼ºµÈ identity¸¦ °¡Áö°í Àִµ¥, ¼ö½ÅÇÑ ¸Þ½ÃÁöµé¿¡¼­ ÀÚ½ÅÀÌ Àü¼ÛÇÑ ¸Þ½ÃÁö¸¦ °¡·Á³»±â À§ÇØ À̸¦ »ç¿ëÇÑ´Ù.

ÀÌ ´Ù¼¸ °³ÀÇ Å¬·¡½º¿Í ÀÎÅÍÆäÀ̽º (Member, MemberManager, Reference, Message ¹× MessageFactory)´Â ÇÔ²² ÇÇ¾î °Ë»öÀ» À§ÇÑ °£´ÜÇÑ ÇÁ·¹ÀÓ¿öÅ©¸¦ Çü¼ºÇÑ´Ù. ¹°·Ð °³¼±ÀÇ ¿©Áö°¡ ÀÖ´Ù. ¸â¹ö°¡ µîÀåÇ߰ųª »ç¶óÁ³À½À» °ü½É ÀÖ´Â listener¿¡°Ô ÅëÁöÇϱâ À§ÇÑ À̺¥Æ® ±â¹Ý ¸ÞÄ¿´ÏÁòÀ» ½±°Ô Ãß°¡ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼ö½ÅÇÑ ¸Þ½ÃÁöµéÀ» °¡·Á³»±â À§ÇÑ À¯¿¬ÇÑ ¸ÞÄ¿´ÏÁòÀÌ ÀÖÀ¸¸é ÁÁ°ÚÁö¸¸, ±¸ÇöÇϱⰡ ´õ ¾î·Á¿ï °ÍÀÌ´Ù. ÀÌ Á¦¾ÈÀº ¿©·¯ºÐÀÌ ¿¬½À»ï¾Æ ±¸ÇöÇغ¸±â ¹Ù¶õ´Ù.

Member Ŭ·¡½º

À§¿¡¼­ ¼³¸íÇÑ ÇÁ·¹ÀÓ¿öÅ©ÀÇ Àüü ¼Ò½º´Â ³Ê¹« ±æ¾î¼­ »ó¼¼ÇÏ°Ô ³ªÅ¸³¾ ¼ö ¾ø±â ¶§¹®¿¡, ´ëºÎºÐÀÇ actionÀÌ µé¾î ÀÖ´Â Member Ŭ·¡½º¿¡ ÇØ´çµÇ´Â ºÎºÐ¸¸ »ìÆ캸ÀÚ. Á» ´õ Á¤È®ÇÏ°Ô ¸»Çϸé, actionÀº MemberClient Ŭ·¡½º¿Í MemberServer Ŭ·¡½º¶ó´Â µÎ °³ÀÇ ³»ºÎ Ŭ·¡½º¿¡¼­ ¹ß»ýÇÑ´Ù.

ù¹ø° ¿¹Á¦¸¦ ´Ù½Ã »ý°¢Çغ¸ÀÚ. ÀÌ ¿¹Á¦´Â IP ¸ÖƼij½ºÆ® µ¥ÀÌÅͱ׷¥À» Àü¼ÛÇϴ Ŭ¶óÀ̾ðÆ®¿Í À̸¦ ¹Þ´Â ¼­¹ö·Î ±¸¼ºµÇ¾î ÀÖ´Ù. ÀÌ ¿¹(Listings 3°ú 4)¿¡¼­´Â µÎ°³ÀÇ °³º°ÀûÀÎ ¾ÖÇø®ÄÉÀ̼ÇÀÌ ÀÌ µÎ ±â´ÉÀ» ¼öÇàÇÑ´Ù. P2P ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ ÇǾîµéÀº Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö ¾çÂÊ°ú À¯»çÇÏ°Ô ÇൿÇÑ´Ù. µû¶ó¼­ ¿ì¸®ÀÇ P2P ¾ÖÇø®ÄÉÀ̼ÇÀÌ ¾çÂÊÀ» Æ÷ÇÔÇØ¾ß ÇÏ´Â °ÍÀÌ ¸Â´Ù.

Listing 3. MemberClient Ŭ·¡½º

private
class MemberClient
extends Thread
{
  public
  void
  run()
  {
    try
    {
      while (true)
      {
        try
        {
          Message message = m_messagefactory.createSendMessage();
          Reference reference = message.createReference();
          message.writeReference(reference);
          message.sync();
          byte [] arb = message.getByteArray();
          DatagramPacket datagrampacket = new DatagramPacket(arb, arb.length);
          datagrampacket.setAddress(m_inetAddress);
          datagrampacket.setPort(m_nPort);
          MulticastSocket multicastsocket = new MulticastSocket();
          multicastsocket.send(datagrampacket);
        }
        catch (IOException ioException)
        {
          ioException.printStackTrace();
        }
        try
        {
          synchronized (this)
          {
            wait(m_nPeriod);
          }
        }
        catch (InterruptedException interruptedException)
        {
          break;
        }
      }
    }
    catch (Throwable throwable)
    {
      throwable.printStackTrace();
    }
  }
}

Listing 3Àº MemberClient Ŭ·¡½ºÀÇ ¼Ò½º¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù. Listing 1ÀÇ Å¬¶óÀ̾ðÆ®¿Í ¸¶Âù°¡Áö·Î ÀÌ Å¬¶óÀ̾ðÆ®´Â MulticastSocket ÀνºÅϽº¸¦ »ý¼ºÇÏ°í À̸¦ ÀÌ¿ëÇÏ¿© DatagramPacket ÀνºÅϽº¸¦ Àü¼ÛÇÑ´Ù. DatagramPacket ÀνºÅϽº´Â ¹ÙÀÌÆ® ¹è¿­·Î ÀÎÄÚµùµÈ ¹ß½Å ÇǾ ´ëÇÑ ÂüÁ¶¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù. ÇǾ »ì¾Æ ÀÖ°í ½ÇÇàµÇ´Â ÇÑ ÀÌ Å¬¶óÀ̾ðÆ®´Â ÀÌ Á¤º¸¸¦ Á¤±âÀûÀ¸·Î ¹æ¼Û(braodcast)ÇÒ °ÍÀÌ´Ù.

Listing 4. MemberServer Ŭ·¡½º

private
class MemberServer
extends Thread
{
  public
  void
  run()
  {
    try
    {
      MulticastSocket multicastsocket = new MulticastSocket(m_nPort);
      multicastsocket.joinGroup(m_inetAddress);
      while (true)
      {
        Message message = m_messagefactory.createReceiveMessage();
        byte [] arb = message.getByteArray();
        DatagramPacket datagrampacket = new DatagramPacket(arb, arb.length);
        multicastsocket.receive(datagrampacket);
        message.sync();
        if (m_messagefactory.isMine(message) == false)
        {
          Reference reference = message.createReference();
          message.readReference(reference);
          m_membermanager.addReference(reference);
        }
      }
    }
    catch (Throwable throwable)
    {
      throwable.printStackTrace();
    }
  }
}

MemberServer Ŭ·¡½º´Â Listing 2ÀÇ ¼­¹ö¿Í ¸¹Àº ¸é¿¡¼­ À¯»çÇÏ´Ù. ÀÌ ¼­¹ö´Â ÇÊ¿äÇÑ ³×Æ®¿öÅ© ¿¬°áÀ» »ý¼ºÇÏ°í À̸¦ ÀÌ¿ëÇØ ³×Æ®¿öÅ©¿¡¼­ ÀûÀýÇÑ µ¥ÀÌÅͱ׷¥À» °¡Á®¿Ã »Ó ¾Æ´Ï¶ó, ÀÎÄÚµùµÈ ÂüÁ¶¸¦ Çص¶ÇÏ°í ¸Þ½ÃÁö¸¦ »ý¼ºÇÏ¿© À̸¦ MemberManager ÀνºÅϽº¿¡ º¸³»¾î ¾ÈÀüÇÏ°Ô º¸°üÇÑ´Ù. ÇÏ·ç ÀϷδ ³ª»ÚÁö ¾Ê´Ù.

Ŭ·¡½ºÀÇ ³ª¸ÓÁö ºÎºÐÀº ´Ù¾çÇÑ Æ¯¼º¿¡ ´ëÇÑ getters¿Í setters ¹× Ŭ·¡½ºÀÇ ¼ö¸í Áֱ⸦ Á¦¾îÇϱâ À§ÇÑ start()¿Í stop() ¸Þ¼Òµå·Î ±¸¼ºµÈ´Ù.

P2P ¾ÖÇø®ÄÉÀ̼Ç

ÇÇ¾î °Ë»ö ÇÁ·¹ÀÓ¿öÅ©°¡ ¿Ï·áµÇ¸é ³²Àº °ÍÀº À̸¦ ±âÁ¸ P2P ¾ÖÇø®ÄÉÀ̼ǿ¡ ÅëÇÕÇÏ´Â ÀÏ »ÓÀÌ´Ù. ¿ì¸®ÀÇ ¿ø·¡ P2P ¾ÖÇø®ÄÉÀ̼ǿ¡ ´ëÇÑ º¯°æÀº ºñ±³Àû Àû´Ù.

¿ì¼± ÀÌÀüÀÇ ¸ð½À¿¡¼­ P2P ¾ÖÇø®ÄÉÀ̼ÇÀº ¸ðµç ¾Ë·ÁÁø ÇǾ ÀÚ½ÅÀÇ Æ¯¼º ÆÄÀÏ¿¡ ³ª¿­µÇ¾î Àֱ⸦ ±â´ëÇß´Ù. ÀÌ´Â °ËÁõ ¸ñÀûÀ¸·Î´Â ±¦Ã¯°í (À§¿¡¼­ ¼³¸íÇÑ ¸ðµç Æ÷ÀÎÆ® ´ë Æ÷ÀÎÆ® ±¸¼ºÀ» ȸ»óÇØ º¸¶ó) ¾à 4°³ÀÇ ÇǾî±îÁö´Â Àß ÀÛµ¿ÇßÁö¸¸ ±Ã±ØÀûÀ¸·Î ¸Å¿ì Á¦ÇÑÀûÀ̾ú´Ù. µû¶ó¼­ Ư¼º ÆÄÀÏ¿¡ È®ÀεǾî ÀÖ´Â ÇǾîµéÀ» ÀÐ°í °ü¸®ÇÏ´Â ÄÚµå´Â ¾ø¾îÁ³À¸¸ç À§ÀÇ °Ë»ö ¸ÞÄ¿´ÏÁòÀ» »ç¿ëÇÏ´Â ÄÚµå·Î ±³Ã¼µÇ¾ú´Ù.

µÑ°, ÇǾîµéÀº Ư¼º ÆÄÀÏ¿¡ ³ª¿­µÇ¾î ÀÖ¾ú±â ¶§¹®¿¡ À̵鿡 ´ëÇÑ ¿µ¼Ó¼ºÀÌ Á¸ÀçÇß´Ù. ±âÁ¸ ¾ÖÇø®ÄÉÀ̼ÇÀº À̵éÀ» »ç¶óÁöÁö ¾Ê´Â ôÇϸ鼭 ¾ø¾Ù ¼ö ÀÖ´Ù. ±×·¯³ª P2PÀÇ ½ÇÁ¦ ¼¼°è´Â ÈξÀ ´õ µ¿ÀûÀÌ´Ù. »õ ¾ÖÇø®ÄÉÀ̼ÇÀº ÇǾ »ç¶óÁ³À» ¶§ Á» ´õ Àß º¹±¸µÇµµ·Ï Àç¼³°èµÇ¾ú´Ù.

Âü°í ÀÚ·á¿¡¼­ ¾÷µ¥ÀÌÆ®µÈ ¼Ò½º Äڵ带 ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.

°á·Ð

ÇǾ °Ë»öÇÏ´Â °ÍÀº ÀüÀïÀÇ ¹ÝÀÏ »ÓÀÌ´Ù. ´ÙÀ½¿¡´Â ÆÄÀ̾î¿ù, °ÔÀÌÆ®¿þÀÌ ¹× ±âŸ ¸¹Àº °ñÄ¡ ¾ÆÇ °Íµé·Î µé¾îÂù Çö´ë ÀÎÅÍ³Ý »ó¿¡¼­ µÎ ÇǾ Åë½ÅÇϵµ·Ï ¸¸µå´Â °Í°ú °ü·ÃµÈ °úÁ¦µéÀ» »ìÆ캸°Ú´Ù.

Âü°íÀÚ·á

ÇÊÀÚ¼Ò°³
Todd Sundsted´Â ÄÄÇ»Å͸¦ µ¥½ºÅ©Å¾ ¸ðµ¨·Î »ç¿ëÇÒ ¼ö ÀÖ¾ú´ø ¶§ºÎÅÍ ¼ÒÇÁÆ®¿þ¾î¸¦ ÀÛ¼ºÇØ ¿Ô´Ù. ±×´Â º¸¾È, ºÐ»ê ÄÄÇ»Æà ¹× ¸Å¿ì Á¤Á¦µÈ ½Ã½ºÅÛ¿¡¼­ ¹ß»ýÇÏ´Â ¿ªµ¿¼º°ú °©ÀÛ½º·¯¿î Çൿ¿¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Ù. Todd´Â ÇÁ·Î±×·¥ ÀÛ¼º»Ó ¾Æ´Ï¶ó ÄÚµùµµ ÇÑ´Ù.


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

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

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