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´Â ÇÁ·Î±×·¥ ÀÛ¼º»Ó ¾Æ´Ï¶ó ÄÚµùµµ
ÇÑ´Ù.