[4th Seoul Workshop] Hotjava Protocol and Content Handler

½Å¸í±â
305-350 ´ëÀü±¤¿ª½Ã À¯¼º±¸ °¡Á¤µ¿ 161¹øÁö
Çѱ¹ÀüÀÚÅë½Å¿¬±¸¼Ò ¸ÖƼ¹Ìµð¾îÇ¥ÁØ¿¬±¸½Ç
E-mail : mkshin@pec.etri.re.kr
URL : http://pec.etri.re.kr/~mkshin/
Abstract:
¼± ¸¶ÀÌÅ©·Î½Ã½ºÅÛÁî¿¡¼­´Â 96³â 5¿ù ÇÖÀÚ¹Ù ÇÁ¸®º£Å¸ ¹öÁ¯À» ¹ßÇ¥Çß´Ù. ´ëºÎºÐÀÇ ÀÎÅÍ³Ý ÇÁ·Î±×·¡¸Ó°¡ ÇÖÀÚ¹Ù º£Å¸ ¹öÁ¯ÀÇ °³¹ßÀ» Çмö°í´ëÇÑ ÀÌÀ¯´Â ÇÖÀÚ¹Ù°¡ ºê¶ó¿ìÀú ÀÌ»óÀÇ Àǹ̸¦ °¡Áö¸ç, ÀÎÅÍ³Ý ºê¶ó¿ìÀú¸¦ ±¸¼ºÇÏ´Â »õ·Î¿î °³³äÀ» Á¦½ÃÇϱ⠶§¹®ÀÌ´Ù. Áï, ÇÖÀÚ¹Ù ºê¶ó¿ìÀú´Â ÀÎÅͳÝ-ÀÎ½Ä ¾îÇø®ÄÉÀ̼Ç(Internet-aware application)À» ±¸¼ºÇϴ Ŭ·¡½º ¶óÀ̺귯¸®·Î¼­ÀÇ ¿ªÇÒÀ» ÇÑ´Ù. ÇÖÀÚ¹Ù´Â ¸ðµç Ç÷§Æû»ó¿¡¼­ ¾ÈÀüÇÏ°Ô µ¿ÀÛÇÒ ¼ö ÀÖ´Â ºê¶ó¿ìÀú¿Í ¾îÇø®ÄÉÀ̼ÇÀ» »ç¿ëÀÚ ÀÔÀå¿¡¼­ ÀÚÀ¯·Ó°Ô ±¸¼º(customization)ÇÒ ¼ö ÀÖÀ¸¸ç, ÇÖÀڹ٠Ŭ·¡½º ¶óÀ̺귯¸®·Î ÀÛ¼ºµÈ ¸ðµç È®ÀåµÈ ÇÁ·Î±×·¥Àº ¸ðµç ÀÚ¹Ù-ȣȯ ȯ°æ¿¡¼­ µ¿ÀÛÀÌ °¡´ÉÇÏ°Ô µÈ´Ù. ÀÌ Àǹ̴ ÇÖÀÚ¹Ù ºê¶ó¿ìÀú¿¡ ÀÎÅͳÝÀ» ¹è°æÀ¸·Î »õ·Î¿î µ¥ÀÌŸ ŸÀÔÀ̳ª ÇÁ·ÎÅäÄÝÀ» ¼Õ½±°Ô È®ÀåÇÒ ¼ö ÀÖÀ½À» ¶æÇÑ´Ù. º» ³í¹®¿¡¼­´Â À̸¦ °¡´ÉÇÏ°Ô ÇÏ´Â ÇÖÀÚ¹ÙÀÇ ÄÁÅÙÆ® Çڵ鷯¿Í ÇÁ·ÎÅäÄÝ Çڵ鷯ÀÇ °³³ä, ÇÁ·Î±×·¡¹Ö ¹æ¹ýµîÀ» ¿¹Á¦¸¦ ÅëÇØ ±â¼úÇÑ´Ù.
Keywords:
ÀÚ¹Ù, ÇÖÀÚ¹Ù, ÇÁ·ÎÅäÄÝ Çڵ鷯, ÄÁÅÙÆ® Çڵ鷯

1. ¼­·Ð

¼± ¸¶ÀÌÅ©·Î½Ã½ºÅÛÁî¿¡¼­´Â JDK 1.0.2¿¡ À̾î 96³â 5¿ù ÇÖÀÚ¹Ù ÇÁ¸®º£Å¸ ¹öÁ¯À» ¹ßÇ¥Çß´Ù. ÇöÀç ÇÖÀÚ¹Ù ¹öÁ¯Àº ÇÁ¸®º£Å¸ 1À̸ç, ÇÖÀÚ¹Ù 1.0ÀÇ ±â´ÉµéÀº ¾ÆÁ÷±îÁö ¿ÏÀüÇÏÁö ¾Ê´Ù. ÇÖÀÚ¹Ù ºê¶ó¿ìÀú°¡ ³Ý½ºÄÉÀÌÇÁ³ª ÀÎÅÍ³Ý ÀͽºÇ÷η¯¿Í °°Àº ºê¶ó¿ìÀú ±â´ÉÀÌ ¿ì¼öÇÑ ´Ù¸¥ À¥ ºê¶ó¿ìÀú¿Í Â÷º°¼ºÀ» °®´Â ÀÌÀ¯´Â ÀÎÅͳÝ-ÀÎ½Ä ¾îÇø®ÄÉÀ̼ÇÀ» ±¸¼ºÇϴ Ŭ·¡½º ¶óÀ̺귯¸®·Î¼­ÀÇ ¿ªÇÒÀ» ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÇÖÀÚ¹Ù´Â ¸ðµç Ç÷§Æû»ó¿¡¼­ ¾ÈÀüÇÏ°Ô µ¿ÀÛÇÒ ¼ö ÀÖ´Â ºê¶ó¿ìÀú¿Í ¾îÇø®ÄÉÀÌ¼Ç À» »ç¿ëÀÚ ÀÔÀå¿¡¼­ ÀÚÀ¯·Ó°Ô ±¸¼ºÇÒ ¼ö ÀÖÀ¸¸ç, ÇÖÀڹ٠Ŭ·¡½º ¶óÀ̺귯¸®·Î ÀÛ¼ºµÈ ¸ðµç È®ÀåµÈ ÇÁ·Î±×·¥Àº ¸ðµç ÀÚ¹Ù-ȣȯ ȯ °æ¿¡¼­ µ¿ÀÛÀÌ °¡´ÉÇÏ°Ô µÈ´Ù. ÀÌ Àǹ̴ ÇÖÀÚ¹Ù ºê¶ó¿ìÀú¿¡ ÀÎÅͳÝÀ» ¹è°æÀ¸·Î »õ·Î¿î µ¥ÀÌŸ ŸÀÔÀ̳ª ÇÁ·ÎÅäÄÝÀ» ¼Õ½±°Ô È®ÀåÇÒ ¼ö ÀÖÀ½ À» ¶æÇÑ´Ù.

ÇöÀç ´ëºÎºÐÀÇ ÀÚ¹Ù ÇÁ·Î±×·¥Àº ÀÚ¹Ù ¾ÖÇø´°ú ¾îÇø®ÄÉÀ̼ÇÀÌ ÁÖ·ù¸¦ ÀÌ·ç°í ÀÖ´Ù. ±×·¯³ª ÇÖÀÚ¹Ù ºê¶ó¿ìÀúÀÇ µ¿ÀûÀÎ ÇÁ·ÎÅäÄÝ, µ¥ÀÌÅÍ Å¸ÀÔÀÇ È®ÀåÀ» À§ÇØ »ç¿ëµÇ´Â ÇÁ·ÎÅäÄÝ Çڵ鷯, ÄÁÅÙÆ® Çڵ鷯 ¶ÇÇÑ Â÷¼¼´ë ÀÚ¹Ù¸¦ ÀÌ¿ëÇÑ ¾îÇø®ÄÉÀÌ¼Ç È®Àå ±â¼ú·Î Â÷Èķδ ¸¹Àº ¿¹Á¦µéÀÌ ½ñ¾ÆÁ® ³ª¿Ã °ÍÀÌ´Ù. ÇÁ·ÎÅäÄÝ Çڵ鷯³ª ÄÁÅÙÆ® Çڵ鷯 ±¸ÇöÀ» À§ÇÑ Ç÷§ÆûÀ¸·Î´Â ÇÖÀÚ¹Ù ºê¶ó¿ìÀú¸¸À» »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡À» À¯ÀÇÇÏÀÚ. º» ³í¹®¿¡¼­´Â À̸¦ °¡´ÉÇÏ°Ô ÇÏ´Â ÇÖÀÚ¹ÙÀÇ ÄÁÅÙÆ® Çڵ鷯¿Í ÇÁ·ÎÅäÄÝ Çڵ鷯ÀÇ °³³ä, ÇÁ·Î±×·¡¹Ö ¹æ¹ýµîÀ» ¿¹Á¦¸¦ ÅëÇØ ±â¼úÇÑ´Ù.

2. ÇÖÀÚ¹Ù : »õ·Î¿î µ¥ÀÌŸ ŸÀÔ°ú ÇÁ·ÎÅäÄÝÀÇ È®Àå

ÇöÀç ÇÖÀÚ¹Ù º£Å¸ ¹öÁ¯¿¡¼­ Áö¿øµÇ´Â ±â´ÉÀº ´ÙÀ½°ú °°´Ù. ÇÖÀÚ¹Ù´Â JDK 1.0À¸·Î ÀÛ¼ºµÈ ¾ÖÇø´À» ºê¶ó¿ì¡ ÇÒ ¼ö ÀÖÀ¸¸ç, ¾ÖÇø´ º¸¾È ±â´É °­È­, ¸ÖƼ¾²·¹µå ¾îÇø®ÄÉÀÌ¼Ç Áö¿ø, ¿©·¯°³ÀÇ URL ¸ñ·Ï À¯Áö µî ¾ËÆÄ ¹öÁ¯°ú´Â ´Ù¸¥ Çâ»óµÈ ±â´ÉµéÀ» ¸¹ÀÌ Áö¿øÇϰí ÀÖ´Ù. ±× Áß¿¡¼­µµ ³Ý½ºÄÉÀÌÇÁ³ª ÀÎÅÍ³Ý ÀͽºÇ÷η¯¿Í Â÷º°È­µÇ´Â °¡Àå Áß¿äÇÑ ±â´ÉÀº ÄÁÅÙÆ® Çڵ鷯¿Í ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ »ç¿ëÇÏ¿© »õ·Ó°Ô ÇÊ¿ä·Î ÇÏ´Â µ¥ÀÌŸ¿Í ÇÁ·ÎÅäÄÝÀÇ Ã³¸® ·çƾÀ» ºê¶ó¿ìÀú¿¡ ½±°Ô È®ÀåÇÒ ¼ö ÀÖ´Â Á¡ÀÌ´Ù. ¿¹¸¦µé¾î »ç¿ëÀÚ ÀÔÀå¿¡¼­ (±×¸² 1)°ú °°ÀÌ VRML°ú °°Àº »õ·Î¿î µ¥ÀÌŸ ŸÀÔÀÇ ºê¶ó¿ì¡À̳ª S(Secure)-HTTP, Multicast¿Í °°Àº ÇÁ·ÎÅäÄÝÀÇ Ã³¸® ·çƾÀ» ±âÁ¸ ºê¶ó¿ìÀúÀÇ ÄÚµå ¼öÁ¤ ¾øÀÌ ½±°Ô È®Àå ÇÒ ¼ö ÀÖ´Ù. Âü°í·Î ³Ý½ºÄÉÀÌÇÁÀÇ Ç÷¯±×-ÀÎ ±â¼úÀº µ¥ÀÌŸ ¸¸À» Ç÷¯±×-ÀÎ ÇÒ ¼ö ÀÖ´Ù.


(±×¸² 1) ÇÖÀÚ¹ÙÀÇ ÇÁ·ÎÅäÄÝ, µ¥ÀÌŸ ó¸® È®Àå ±â¼ú

ÇöÀç Á¦°øµÇ´Â ÇÁ¸®º£Å¸ ¹öÁ¯Àº ÀÌ·¯ÇÑ ÇÁ·ÎÅäÄÝ Çڵ鷯, ÄÁÅÙÆ® Çڵ鷯¸¦ ºê¶ó¿ìÀú³»ÀÇ ·ÎÄà ȭÀÏ ½Ã½ºÅÛ¿¡ ÀνºÅç ÇÏ´Â ¹æ½ÄÀ¸·Î ±¸ÇöÇØ¾ß ÇÏÁö¸¸, 1.0 Á¤½Ä ¹öÁ¯¿¡¼­´Â ÀÌ·¯ÇÑ ºê¶ó¿ìÀú È®Àå ÇÁ·Î±×·¥À» ´Ù¿î·Îµå ¹Þ¾Æ »ç¿ëÇÒ ¼ö ÀÖ°Ô²û ±â´ÉÀÌ Çâ»óµÉ ¿¹Á¤À̾ ÁøÁ¤ÇÑ ³×Æ®¿÷ ¼ÒÇÁÆ®¿þ¾î È®Àå ±â¼ú·Î¼­ ¼±º¸ÀÌ°Ô µÉ °ÍÀÌ´Ù.

ÀϹÝÀûÀÎ À¥ ÇÁ·ÎÅäÄÝ(http, ftp, telnet, news, mailto ...)°ú ÄÁÅÙÆ® (html, text, gif, jpg ...)ÀÇ Ã³¸®´Â À¥ ºê¶ó¿ìÀúÀÇ °íÁ¤È­µÈ Çù»ó °úÁ¤À» ÅëÇØ ÀÌ·ç¾îÁø´Ù. ¹Ý¸é, ÇÖÀÚ¹Ù ºê¶ó¿ìÀú´Â (±×¸² 2)¿Í °°Àº µ¿ÀûÀÎ Çù»ó°úÁ¤ÀÌ ÀÌ·ç¾îÁö¹Ç·Î, »õ·Î¿î ÇÁ·ÎÅäÄÝ, µ¥ÀÌŸ¸¦ È®ÀåÇÒ ¼ö ÀÖ´Â °¡´É¼ºÀÌ »ý±â°Ô µÈ´Ù.



(±×¸² 2) ÇÖÀÚ¹ÙÀÇ µ¥ÀÌŸ, ÇÁ·ÎÅäÄÝ Ã³¸®

ÇÁ·ÎÅäÄÝ Çڵ鷯ÀÇ °æ¿ì´Â µðÆúÆ®·Î ´ÙÀ½°ú °°Àº URL ÀÔ·Â ½ºÆ®¸µ ÆÄ½ÌÀ» ÅëÇØ
    <protocol>://<host>/<file>
                
ÇÁ·ÎÅäÄÝ Ã³¸® ·çƾÀ» ã°Ô µÇ¸ç, »õ·Î¿î ÇÁ·ÎÅäÄÝÀÎ °æ¿ì, ÇØ´çÇÏ´Â ÇÁ·ÎÅäÄÝ Çڵ鷯 ·çƾÀ» ã¾Æ 󸮸¦ ÇϰԵȴÙ. ÀÌ·¯ÇÑ ¹æ½ÄÀº ±âÁ¸ ÇÁ·ÎÅäÄÝÀÇ À¥ ±â´É È®Àå¸é »Ó¸¸ ¾Æ´Ï¶ó »ç¿ëÀÚ°¡ »õ·Ó°Ô Á¤ÀÇÇÑ ÇÁ·ÎÅäÄÝ¿¡ ÀÌ·ç±â±îÁö Æø³Ð°Ô Àû¿ë°¡´ÉÇÏ´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°Àº Àû¿ëÀÌ °¡´ÉÇÑ´Ù. ÀÌ·¯ÇÑ ÇÁ·ÎÅäÄÝÀÇ °á°ú·Î ¹ÝȯµÇ´Â µ¥ÀÌŸ °ªÀº MIME ŸÀÔ(text/html, text/plain, image/gif, image/jpg ...)¿¡ µû¶ó 󸮵Ǹç, »õ·Î¿î ŸÀÔÀ» °®´Â ÄÁÅÙÆ®°¡ ¿ä±¸µÇ¸é(¿¹¸¦µé¾î video/mbone, appication/xmcm ...) ±× 󸮸¦ À§ÇÑ ÄÁÅÙÆ® Çڵ鷯 ·çƾÀ» ã¾Æ µ¿ÀÛÇÏ°Ô µÈ´Ù.

3. ÇÁ·ÎÅäÄÝ Çڵ鷯 ÇÁ·Î±×·¡¹Ö

ÇÁ·ÎÅäÄÝ Çڵ鷯¶õ ƯÁ¤ ÇÁ·ÎÅäÄÝÀÇ Ã³¸®°¡ ¿ä±¸µÉ ¶§ ÇÖÀÚ¹Ù°¡ ·ÎµåÇÏ´Â ÀÚ¹Ù ÇÁ·Î±×·¥À¸·Î, »õ·Î¿î ÇÁ·ÎÅäÄÝÀ» ÇÖÀÚ¹Ù ºê¶ó¿ìÀú¿¡ ½±°Ô È®ÀåÇÏ´Â ÇÏ´Â ±â¼úÀÌ´Ù. Âü°í·Î ³Ý½ºÄÉÀÌÇÁ¿¡¼­´Â Áö¿øµÇÁö ¾ÊÀ¸¸ç, ÇÖÀÚ¹Ù¿¡¼­¸¸ °¡´ÉÇÏ´Ù.

±âÁ¸ À¥ ºê¶ó¿ìÀú¿¡¼­´Â http, ftp, telent¿Í °°Àº ÇÁ·ÎÅäÄݵéÀ» Áö¿øÇϰí ÀÖ´Ù. º» ³í¹®¿¡¼­´Â finger ÇÁ·ÎÅäÄÝÀ» À§ÇÑ Äڵ带 ÇÁ·ÎÅäÄÝ Çڵ鷯·Î ÀÛ¼ºÇÏ¿© ÇÖÀÚ¹Ù¿¡¼­ È®Àå »ç¿ëÀÌ °¡´ÉÇϵµ·Ï ÀνºÅç½ÃÄѺ¸ÀÚ. ÀÎÅÍ³Ý µµ¸ÞÀÎ etri.re.krÀ» °®´Â ȯ°æ¿¡¼­ finger ¼­ºñ½º¸¦ À§ÇÑ ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ ÀνºÅçÇÏ¿© ó¸®ÇϰíÀÚ ÇÑ´Ù¸é ´ÙÀ½°ú °°Àº ÀνºÅç °úÁ¤°ú ÇÁ·Î±×·¡¹Ö °úÁ¤ÀÌ ¿ä±¸µÈ´Ù. ÀÎÅÍ³Ý µµ¸ÞÀÎÀ» µû¶ó ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ ÀÛ¼ºÇÏ´Â ÀÌÀ¯´Â ³×ÀÌ¹Ö Ãæµ¹À» ¹æÁöÇϱâ À§Çؼ­ÀÌ´Ù.

3.1 µð·ºÅ丮 »ý¼º

ÇÁ·ÎÅäÄÝ Çڵ鷯°¡ µ¿ÀÛÇÒ µð·ºÅ丮¸¦ ´Ü°èº°·Î »ý¼ºÇÑ´Ù.
        classes - kr - re - etri- protocol - finger
´ë°³ µð·ºÅ丮ÀÇ ½ÃÀÛÀº classes·Î Çϸç, ³ª¸ÓÁö 4°¡Áö µð·ºÅ丮 À̸§Àº kr.re.etri.protocol ÆÐŰÁö¸¦ »ý¼ºÇϱâ À§ÇÑ À̸§µéÀÌ´Ù. ¸¶Áö¸· finger µð·ºÅ丮´Â ÇÁ·ÎÅäÄÝ Çڵ鷯ÀÇ À̸§°ú °°¾Æ¾ß ÇÑ´Ù.

3.2 ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ À§ÇÑ ÀÚ¹Ù ¼Ò½º ÆÄÀÏ ÀÛ¼º

        classes - kr - re - etri- protocol - finger - Handler.java
                                                   |- FingerURLConnection.java
finger ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ À§ÇÑ ÀÚ¹Ù ¼Ò½º ÆÄÀÏÀÎ Handler.java¿Í FingerURLConnection.java¸¦ finger µð·ºÅ丮 ¾Æ·¡¿¡ ÀÛ¼ºÇÑ´Ù. ÆÐŰÁö·Î package kr.re.etri.protocol.finger°¡ ¼±¾ðµÇ¾î¾ß Çϸç, Handler.java ÇÁ·Î±×·¥Àº java.net ÆÐŰÁöÀÇ URLStreamHandler Ŭ·¡½ºÀÇ ÇÏÀ§Å¬·¡½º·Î Á¤ÀÇÇØ¾ß Çϸç, FingerURLConnection.java ÇÁ·Î±×·¥Àº URLConnectionÀÇ ÇÏÀ§Å¬·¡½º·Î Á¤ÀÇÇØ¾ß ÇÔÀ» À¯ÀÇÇÑ´Ù.

URLStreamHandler Ŭ·¡½º´Â JDK 1.0.2 java.net ÆÐŰÁö¿¡ ´ÙÀ½°ú °°Àº °èÃþ ±¸Á¶·Î Æ÷ÇԵǾî ÀÖÀ¸¸ç Á¤ÀÇµÈ ¸Þ¼Òµå´Â ´ÙÀ½°ú °°´Ù.

java.lang.Object
   |
   +----java.net.URLStreamHandler
ÇÖÀÚ¹Ù ºê¶ó¿ìÀúÀÇ Æ¯Â¡Àº µ¥ÀÌŸ¿Í ÇÁ·ÎÅäÄÝ Ã³¸®¸¦ À§ÇÑ ÄÁÅÙÆ® Çù»ó °úÁ¤ÀÌ µ¿ÀûÀ¸·Î ÀÌ·ç¾î Áø´Ù´Âµ¥ ÀÖ´Ù. Áï, »ç¿ëÀÚ°¡ Ưº°È÷ ÁöÁ¤ÇØ ³õÁö ¾ÊÀ¸¸é ±âÁ¸ ÇÖÀÚ¹Ù¿¡¼­ ±¸ÇöµÈ µðÆúÆ® ÄÚµå·Î Çù»ó °úÁ¤ÀÌ ÀϾ¸ç, »ç¿ëÀÚ°¡ Á¤ÀÇÇØ ³õÀº ÄÚµå(Áï, ÇØ´ç ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ ³õÀ¸¸é) ±× Äڵ带 ¼öÇàÇÏ°Ô µÈ´Ù.

Handler.java ÄÚµå´Â (ÄÚµå 1)°ú °°´Ù. openConnection() ¸Þ¼Òµå´Â ¿À¹ö¶óÀ̵åµÇ¾î ÁÖ¾îÁø urlÀ» °¡Áö°í FingerURLConnection(url) Ŭ·¡½º¸¦ È£ÃâÇϰԲû µÇ¾îÀÖ´Ù. fingerÀÇ URL ½ºÅ´ Á¤ÀǸ¦ À§ÇØ parseURL()°ú toExternalForm()À» ¿À¹ö¶óÀ̵å ÇÏ¿´´Ù.

//ÄÚµå 1 : Handler.java 
package kr.re.etri.protocol.finger;

import java.net.*;
import java.io.*;
import java.util.StringTokenizer;

public class Handler extends java.net.URLStreamHandler {
    
    static void debug(String s) {
        System.err.println(s);
    }

    public Handler () {
        System.out.println("Made a FingerURLStreamHandler");
    }

    protected URLConnection openConnection(URL url) throws IOException {
        return new FingerURLConnection(url);
    }

    protected void parseURL(URL u, String spec, int start, int limit) {
        String protocol = u.getProtocol(); 
        String host = new String();
        int port = u.getPort();
        if(port <=0)
            port = 79; // default port for finger
        String file = new String();
        String ref = null;
        StringTokenizer st = null;

        if ((start <= limit )) {
            while(spec.charAt(start) == '/' || spec.charAt(start) == ':')
                start++;
        }
           
        st = new StringTokenizer(spec.substring(start), ",", false);
        
        while(st.hasMoreTokens()) {
            String elem = st.nextToken();
            String newHost, newUser;
            int i;
            if(elem == null)
                continue;
            i = elem.indexOf('@');
            if(i < 0) {
                try {
                    newHost = InetAddress.getLocalHost().getHostName();
                } catch (UnknownHostException e) {
                    newHost = "localhost";
                }
            }
            else
                newHost = new String(elem.substring(i + 1));
            newUser = new String(elem.substring(0, i));
            if(host.length() != 0) {
                file += ",";
                host += ",";
            }
            file += newUser;
            host += newHost;
        }
        setURL(u, protocol, host, port, file, ref);
    }   

    /**
     * reverse parse the URL - put back to "original" form
     */
    protected String toExternalForm(URL u) {
        StringTokenizer st1 = new StringTokenizer(u.getFile(), ",", false);
        StringTokenizer st2 = new StringTokenizer(u.getHost(), ",", false);

        String body = new String();

        while(st1.hasMoreTokens() && st2.hasMoreTokens()) 
            body += st1.nextToken() + "@" + st2.nextToken() + ",";
        
        return new String(u.getProtocol() + "://" + body);
    }
}
¶ÇÇÑ °°Àº µð·ºÅ丮¿¡ FingerURLConnection.java ¼Ò½º ÆÄÀϵµ (ÄÚµå 2)¿Í °°ÀÌ ÀÛ¼ºÇÑ´Ù.
//ÄÚµå 2 : FingerURLConnection.java
package kr.re.etri.protocol.finger;

import java.net.*;
import java.io.*;
import java.util.StringTokenizer;
import java.util.Date;

public class FingerURLConnection extends java.net.URLConnection {

private void debug(String s) {
    System.err.println(s);
}
    private Socket server = null;

    public FingerURLConnection (URL url) {
        super(url);
        System.out.println("Made a FingerURLConnection");
    }


public Object getContent() throws IOException {
    debug("In FingerURLConnection.getContent()");
    StringBuffer sb = new StringBuffer();
    sb.append("<TITLE>Finger output</TITLE>\n<HTML>");
    StringTokenizer st1 = new StringTokenizer(url.getFile(), ",", false);
    StringTokenizer st2 = new StringTokenizer(url.getHost(), ",", false);

        while (st1.hasMoreTokens() && st2.hasMoreTokens()) {

           sb.append("<P><HR>" + getSingleData(st1.nextToken(), st2.nextToken()));
        }

        sb.append("<P><P><HR>" + ((new Date()).toString()) + "\n</HTML>");
        return sb.toString();
}

public void connect() throws IOException {
    debug("fingerURLconn::connect");
}


private String getSingleData(String user, String host) {
        try {
            server = new Socket(host, 79);
            System.out.println("Made socket to " + host + " on port " + 79);
        } catch (UnknownHostException uk) {
            debug("Unknown host in getSingleData: " + host);
            return "<PRE>Unknown host " + host + "</PRE>";
        } catch (SocketException ee) {
            debug("SocketException in getSingleData: " + host);
            return "<PRE>No finger server running on " + host + "</PRE>";
        } catch (IOException eee) {
            debug("IOException in getSingleData, making socket: " 
                   + eee.getMessage());
            eee.printStackTrace();
            return "<PRE>IOError connecting to " + host + "</PRE>";
        }

        
    debug("write to socket");

    PrintStream ps = null;
    DataInputStream dis = null;
    try {
        ps = new PrintStream(server.getOutputStream());
        dis = new DataInputStream(server.getInputStream());
    } catch (IOException e) {
        debug("input/output error making streams: " + e.getMessage());
        e.printStackTrace();
        return "<PRE>ERROR OCCURRED</PRE>";
    }

    ps.println(user);

    String li = null;
    StringBuffer sb = new StringBuffer();
    sb.append("<PRE>Finger data for " + user + "@" + host + ":</PRE><BR>\n");
    try {
        while((li = dis.readLine()) != null) {
            debug("Server output:>> " + li);
            sb.append(li + "\n<P>");
        }
    } catch (IOException e) {
        debug("input/output error in readLine: " + e.getMessage());
        e.printStackTrace();
        return "<PRE>ERROR OCCURRED</PRE>";
    }   
    return sb.toString();
}

public InputStream getInputStream() throws IOException {

    debug("In FingerURLConn::getInputStream");
    if(!connected)
        connect();
    
    return new StringBufferInputStream((String)getContent());
}

public String getContentType() {
    debug("getting FingerURLConn::ContentType()");
    return "text/html";
}

public OutputStream getOutputStream() throws IOException {
    if(!connected)
        connect();
    return null;
}
}

3.3 Ŭ·¡½ºÆÐ½º¸¦ ¼¼ÆÃ

CLASSPATH º¯¼ö¸¦ ¼¼ÆÃÇÑ´Ù. À¯´Ð½ºÀÎ °æ¿ì,
        setenv CLASSPATH .:/home/developer/classes
µµ½º ½©(Windows 95/NT)ÀÎ °æ¿ì,
        set CLASSPATH=.;C:\developer\classes

3.4 ¼Ò½º¸¦ ÄÄÆÄÀÏ

ÀÚ¹Ù ÄÄÆÄÀÏ·¯¸¦ ÀÌ¿ëÇØ ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ ÄÄÆÄÀÏÇÑ´Ù. À¯´Ð½ºÀÎ °æ¿ì,
        cd kr/re/etri/protocol/finger
        javac Handler.java
        javac RunURLConnection.java
        
µµ½º ½©(Windows 95/NT)ÀÎ °æ¿ì
        cd kr\re\etri\protocol\finger
        javac Handler.java
        javac RunURLConnection.java
        

3.5 java.protocol.handler.pkgs ÇÁ¶óÆÛƼ ¼¼ÆÃ

ÇÖÀÚ¹Ù ÇÁ¶óÆÛƼ ÆÄÀÏÀº À¯´Ð½º³Ä µµ½º ½©À̳Ŀ¡ µû¶ó ´ÙÀ½°ú °°ÀÌ À§Ä¡Çϰí ÀÖ´Ù. À¯´Ð½ºÀÎ °æ¿ì,
        $HOME/.hotjava/properties
        
µµ½º ½©(Windows 95/NT)ÀÎ °æ¿ì,
        \.hotjava\properties
        
ÇÖÀÚ¹Ù ÇÁ¶óÆÛƼ ÆÄÀÏ¿¡ »õ·Î¿î ÆÐŰÁöÀÎ kr.re.etri.protocol.finger¸¦ Æ÷ÇÔÇϵµ·Ï ¼¼ÆÃÇÑ´Ù.
        java.protocol.handler.pkgs=kr.re.etri.protocol
        

3.6 ÇÁ·ÎÅäÄÝ Çڵ鷯 ±¸µ¿

ÇÖÀÚ¹Ù¸¦ »õ·Ó°Ô ±¸µ¿½ÃŲ ÈÄ ´ÙÀ½°ú °°Àº URLÀ» »ç¿ëÇØ finger ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ ÅëÇØ finger ¼­ºñ½º¸¦ ¹Þ¾Æº¸ÀÚ.
        finger://mkshin@pec.etri.re.kr
        
ÇÖÀÚ¹ÙÀÇ °á°ú È­¸éÀº (±×¸² 3)°ú °°´Ù.


(±×¸² 3) finger ÇÁ·ÎÅäÄÝ Çڵ鷯 °á°ú È­¸é

4. ÄÁÅÙÆ® Çڵ鷯 ÇÁ·Î±×·¡¹Ö

ÄÁÅÙÆ® Çڵ鷯¶õ ƯÁ¤ MIME ŸÀÔ(text/plain, text/richplain, image/gif µî) Å×ÀÌÅÍÀÇ ºê¶ó¿ì¡ÀÌ ÇÊ¿ä·Î ÇÒ ¶§ ÇÖÀÚ¹Ù°¡ ·ÎµåÇÏ´Â ÀÚ¹Ù ÇÁ·Î±×·¥À¸·Î, »õ·Î¿î ŸÀÔÀÇ µ¥ÀÌÅÍÀÇ Ã³¸® Äڵ带 È®ÀåÇÏ´Â ±â¼úÀÌ´Ù. ³Ý½ºÄÉÀÌÇÁ¿¡¼­´Â Áö¿øµÇÁö ¾Ê°í ÇÖÀÚ¹Ù¿¡¼­¸¸ °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î ÀÎÅÍ³Ý µµ¸ÞÀÎ etri.re.krÀ» °®´Â ȯ°æ¿¡¼­ MIME ŸÀÔ text/plainÀ» °®´Â ¸ðµç ¸Þ½ÃÁö¸¦ ÇÁ·ÎÅäÄÝ Çڵ鷯¸¦ ÀνºÅçÇÏ¿© ó¸®ÇϰíÀÚ ÇÑ´Ù¸é, ´ÙÀ½°ú °°Àº °úÁ¤À¸·Î ÄÁÅÙÆ® Çڵ鷯¸¦ ±¸Ãà ÇÏ¸é µÈ´Ù.

4.1 µð·ºÅ丮 »ý¼º

ÄÁÅÙÆ® Çڵ鷯°¡ µ¿ÀÛÇÒ µð·ºÅ丮¸¦ ´Ü°èº°·Î »ý¼ºÇÑ´Ù.
        classes - kr - re - etri - content - text
´ë°³ µð·ºÅ丮´Â classes·Î ½ÃÀÛÇϸç, ³ª¸ÓÁö 4°¡Áö µð·ºÅ丮 À̸§Àº kr.re.etri.content ÆÐŰÁö¸¦ »ý¼ºÇϱâ À§ÇÑ À̸§µéÀÌ´Ù. ¸¶Áö¸· text µð·ºÅ丮´Â µ¥ÀÌÅÍÀÇ MIME ŸÀÔ°ú °°Àº À̸§À» °¡Á®¾ß ÇÑ´Ù.

4.2 ÄËÅÙÆ® Çڵ鷯¸¦ À§ÇÑ ÀÚ¹Ù ¼Ò½º ÆÄÀÏ ÀÛ¼º

        classes - kr - re - etri - content - text - plain.java
text µð·ºÅ丮 ¾Æ·¡¿¡ text/plain ŸÀÔÀÇ ¹®¼­¸¦ ó¸®Çϱâ À§ÇÑ ÀÚ¹Ù ¼Ò½º ÆÄÀÏÀÎ plain.java¸¦ ÀÛ¼ºÇÑ´Ù. ÆÐŰÁö·Î package kr.re.etri.content.text°¡ ¼±¾ðµÇ¾î¾ß Çϸç, java.net ÆÐŰÁöÀÇ ContentHandler Ŭ·¡½ºÀÇ ÇÏÀ§Å¬·¡½º ·Î Á¤ÀÇÇØ¾ß ÇÔÀ» À¯ÀÇÇÑ´Ù.

ContentHandler Ŭ·¡½º´Â JDK1.0.2 java.net ÆÐŰÁö¿¡ ´ÙÀ½°ú °°Àº °èÃþ ±¸Á¶·Î Æ÷ÇԵǾî ÀÖÀ¸¸ç Á¤ÀÇµÈ ¸Þ¼Òµå´Â ´ÙÀ½°ú °°´Ù.

java.lang.Object
   |
   +----java.net.ContentHandler
plain.java ¼Ò½º ÄÚµå´Â ´ÙÀ½°ú °°´Ù.
// ÄÚµå 3 plain.java

package kr.re.etri.content.text;

import java.net.ContentHandler;
import java.io.InputStream;
import java.net.URLConnection;
import java.io.IOException;

public class plain extends ContentHandler {

  public Object getContent(URLConnection uc) {
      try {
           InputStream is = uc.getInputStream();
           StringBuffer sb = new StringBuffer();
           int c;

           sb.append("[Content of " + uc.getURL() + "]\n\n");
           sb.append("[This opening message brought to you by your   
                    plain/text\n");
           sb.append("content handler. To remove this content handler,
                    delete the\n");
           sb.append("kr.re.etri.content.text directory from your class path
                    and\n");
           sb.append("the java.content.handler.pkgs property from your
                    HotJava\n");
           sb.append("properties file.]\n");
                   
           sb.append("-------------------------------------\n\n");

           while ((c = is.read()) >= 0) {
                sb.append((char)c);
           }

           is.close();

           return sb.toString();
        } catch (IOException e) {
            
           return "Problem reading document: " + uc.getURL();
        }
    }
}

4.3 Ŭ·¡½ºÆÐ½º¸¦ ¼¼ÆÃ

CLASSPATH º¯¼ö¸¦ ¼¼ÆÃÇÑ´Ù. À¯´Ð½ºÀÎ °æ¿ì,
        setenv CLASSPATH .:/home/developer/classes
µµ½º ½©(Windows 95/NT)ÀÎ °æ¿ì,
        set CLASSPATH=.;C:\developer\classes

4.4 ¼Ò½º¸¦ ÄÄÆÄÀÏ

ÀÚ¹Ù ÄÄÆÄÀÏ·¯¸¦ ÀÌ¿ëÇØ plain.java ¼Ò½º¸¦ ÄÄÆÄÀÏÇÑ´Ù.
        javac plain.java

4.5 java.content.handler.pkgs ÇÁ¶óÆÛƼ ¼¼ÆÃ

ÇÖÀÚ¹Ù ÇÁ¶óÆÛƼ ÆÄÀÏÀº À¯´Ð½º³Ä µµ½º ½©À̳Ŀ¡ µû¶ó ´ÙÀ½°ú °°ÀÌ À§Ä¡Çϰí ÀÖ´Ù. À¯´Ð½ºÀÎ °æ¿ì,
        $HOME/.hotjava/properties
µµ½º ½©(Windows 95/NT)ÀÎ °æ¿ì,
        \.hotjava\properties
ÇÖÀÚ¹Ù ÇÁ¶óÆÛƼ ÆÄÀÏ¿¡ »õ·Î¿î ÄÁÅÙÆ® ÆÐŰÁöÀÎ kr.re.etri.content.text¸¦ Æ÷ÇÔÇϵµ·Ï ¼¼ÆÃÇÑ´Ù.
        java.content.handler.pkgs=kr.re.etri.content

4.6 text/plainÀ» ó¸®Çϴ Ưº°ÇÑ mailcap Á¤º¸¸¦ »èÁ¦

4.6 »õ·Ó°Ô ÇÖÀÚ¹Ù¸¦ ±¸µ¿

ÀÌÁ¦ ÄÁÅÙÆ® Çڵ鷯´Â ÇÖÀÚ¹Ù°¡ plain/text ¹®¼­¸¦ ·ÎµåÇÒ ¶§¸¶´Ù ÀÚµ¿À¸·Î ºÒ·ÁÁø´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº ¹®¼­ÀÇ ÅØ½ºÆ®ÀÎ content.txt¸¦ ·ÎµåÇß´Ù¸é,
        This document has two lines.  This is the first line.
        This is the second (and last) line.
ÇÖÀÚ¹Ù ºê¶ó¿ìÀú ³»¿¡´Â ´Ü¼øÈ÷ À§ÀÇ µÎÁÙ¸¸ÀÌ Ãâ·ÂµÇ´Â °ÍÀÌ ¾Æ´Ï°í (ÄÚµå 3)ÀÇ getContent() ¸Þ¼Òµå¿¡¼­ Á¤ÀÇµÈ Ãâ·ÂÆû´ë·Î (±×¸² 4)¿Í °°Àº °á°ú°¡ Ãâ·ÂµÈ´Ù.


(±×¸² 4) text/plain ÄÁÅÙÆ® Çڵ鷯 °á°ú È­¸é

5. °á·Ð

º» ³í¹®¿¡¼­´Â ÇÖÀÚ¹ÙÀÇ ÇÁ·ÎÅäÄݰú µ¥ÀÌŸ ó¸® È®ÀåÀ» À§ÇÑ ÇÁ·ÎÅäÄÝ Çڵ鷯, ÄÁÅÙÆ® Çڵ鷯ÀÇ °³³ä°ú °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö ¹æ¹ý·ÐÀ» ±â¼úÇß´Ù. ÀÌ µÎ°¡Áö °³³äÀ» ÀÌ¿ëÇϸé, ÀÎÅÍ³Ý È¯°æ¿¡¼­ À¥ ºê¶ó¿ìÀú¸¦ º¸´Ù °æ·ÂÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º ȯ°æÀ¸·Î È®ÀåÇÒ ¼ö ÀÖ´Ù. ÇöÀç±îÁö ÀÚ¹Ù¸¦ ÀÌ¿ëÇÑ ÇÁ·Î±×·¥Àº ÁÖ·Î ¾ÖÇø´À¸·Î¸¸ ±¹ÇѵǾî ÀÖÀ¸³ª, Á¶¸¸°£ ÇÖÀÚ¹Ù 1.0 Á¤½Ä ¹öÁ¯ÀÌ Á¦°øµÇ°í, ³×Æ®¿÷ ÄÄÇ»ÅÍÀÇ »ó¿ëÈ­°¡ ÀÌ·ç¾îÁö¸é, ÀÌ·¯ÇÑ ÇÁ·ÎÅäÄÝ/ÄÁÅÙÆ® Çڵ鷯ÀÇ ÇÁ·Î±×·¥Àº ´õ¿í´õ ¸¹ÀÌ °³¹ßµÇ¾î Áú °ÍÀÌ´Ù.

Âü°í¹®Çå(References)

[SUN 96a]
SunSoft, Installing a Local Content Handler, 1996
URL:http://java.s un.com:80/HotJava/1.0-prebeta1/UsersGuide/handlers/content.html
[SUN 96b]
SunSoft, Installing a Local Protocol Handler, 1996
URL:http://java.s un.com:80/HotJava/1.0-prebeta1/UsersGuide/handlers/protocol.html
[SUN 96c]
SunSoft, HotJava(tm) User's Guide, 1996
URL:http://java.sun.com:80/ HotJava/1.0-prebeta1/UsersGuide/users.html
[JavaOne 96]
Pavani Diwanji, Dave Brown, Advanced Tutorial: Network-Based Applications, JavaOne Conference, 1996
URL:http://java.sun.com:80/javaone/pres/NetAp ps.pdf
[½Å¸í±â 96]
½Å¸í±â, ÃÖÈñâ, ÀÚ¹Ù»ç³É, Á¤º¸½Ã´ë, 1996
URL:http://pec.etri.re.kr/~mkshin/publication/h unt.html