Learning Community

ผลงานวิทยานิพนธ์
ของคุณ พนิต เวชศิลป์
ภาควิชาวิศวกรรมคอมพิวเตอร์
สถาบันเทคโนโลยีพระจอมเกล้าเจ้าคุณทหารลาดกระบัง

ปรับแก้ไขโดยนาย รุ่งโรจน์ โรจนโพธิ์ ( ธันวาคม 2548 )




Learning Community
• Home
• Jini Beginning
- บทเรียนที่ 1
- บทเรียนที่ 2
- บทเรียนที่ 3
- บทเรียนที่ 4
- บทเรียนที่ 5
- บทเรียนที่ 6
- บทเรียนที่ 7
- บทเรียนที่ 8
- บทเรียนที่ 9


บทที่ 2

Jini Network Concept



2.1 ภาพรวมของ Jini Network


            Jini คือชื่อของระบบออบเจ็กต์แบบกระจายตัวหนึ่ง โดยมีคุณสมบัตที่เรียกว่า “Network Plug and Play” อุปกรณ์ต่าง ๆ ไม่ว่าจะเป็นซอฟต์แวร์หรือฮาร์แวร์สามารถเชื่อมต่อกับระบบ แล้วทำการแจ้งให้ระบบทราบถึงการมาของตน ฝัง Client ที่ต้องการจะเรียกใช้บริการต่าง ๆ บนเครือข่ายสามารถที่จะค้นหาบริการนั้นจากเครือข่ายแล้วทำการเรียกใช้บริการจากผู้ให้บริการนั้นได้ ซึ่งระบบนี้เหมาะกับเครือข่ายที่มีความเปลี่ยนแปลงตลอดเวลา ( Dynamic ) ตัวอย่างสถานการณ์ที่เหมาะสมกับการใช้ Jini Network ก็คือ
  1. มีเครื่อง Printer มาเชื่อมต่อกับเครือข่ายและได้แจ้งให้กับระบบรู้ถึงการเชื่อมต่อของตน และประสิทธิภาพของเครื่องที่ทำได้ ซึ่ง Client สามารถเรียกใช้เครื่อง Printer เครื่องนี้ในการพิมพ์งานได้ทันที โดยไม่ต้องมีการปรับแต่งอะไรเลย
  2. มีกล้องถ่ายรูปแบบดิจิตอลมาเชื่อมต่อกับเครือข่ายแล้วต้องการจะขอใช้บริการการพิมพ์จากเครื่อง Printer สามารถขอใช้บริการได้เลยโดยที่ไม่ต้องมีการติดตั้ง ไดรเวอร์ของเครื่อง Printer
  3. อุปกรณ์ใหม่ๆสามารถเพิ่มเติมเข้ามาในระบบได้ โดยที่ไม่ต้องมีการหยุดการทำงานของระบบและไม่ต้องมีการกลับมาปรับแต่งอะไรกับระบบเครือข่ายอีก
  4. ผู้ให้บริการสามารถแจ้งกับระบบได้ถึงการเปลี่ยนแปลงสถานะบางอย่างของระบบ เช่น Printer กระดาษหมด โดยที่ Client สามารถดักรอการเปลี่ยนแปลงของสถานะต่าง ๆ ได้
Jini คือระบบหรือกลุ่มของ Service และ Client ที่มีการติดต่อสื่อสารกันด้วย Jini Protocol ซึ่งปรกติแล้วจะประกอบไปด้วย แอพพลิเคชันที่สร้างขึ้นมาด้วยภาษาจาวามีการติดต่อสื่อสารกันด้วยกระบวนการของ Java RMI แต่ถึงแม้ว่า Jini จะถูกสร้างขึ้นมาด้วยภาษาจาวาล้วนๆ แต่ว่า Client หรือ Service ต่าง ๆ ที่มาเชื่อมต่อกับ Jini Network นั้นไม่จำเป็นต้องถูกสร้างขึ้นมาด้วยภาษาจาวาอย่างเดียว อาจจะถูกสร้างขึ้นมาด้วย Native Method แล้วถูกห่อหุ้มด้วย Java Object หรือแม้กระทั่งเป็น Object ที่ถูกสร้างขึ้นมาด้วยภาษาอื่นก็สามารถทำได้ ทั้งหมดต้องการเพียงแค่การสื่อสารกันด้วย Jini Protocol เท่านั้น

2.2 องค์ประกอบของ Jini Network


Jini เป็นประเภทหนึ่งจากหลาย ๆ สถาปัตยกรรมของระบบออบเจ็กต์แบบกระจาย ซึ่งรวมไปถึงระบบที่เป็นมาตรฐานอุตสาหกรรมอย่างเช่น CORBA และ DCOM แต่แตกต่างกันที่ Jini นั้นมีพื้นฐานมาจากภาษาจาวาซึ่งสามารถใช้คุณสมบัติต่าง ๆ ของภาษาจาวาได้อย่างครบถ้วน และยังมีเฟรมเวิร์กของจาวาตัวอื่น ๆ อีกที่ทางซันได้พัฒนาออกมาซึ่งมีส่วนที่คล้ายกับ Jini อื่น ๆ ในภายหลัง เช่น JARO, JXTA หรือ Enterprise Java Beans ทำให้ Jini สามารถทำงานร่วมกับเฟรมเวิร์กอื่น ๆ ของบริษัท Sun Microsystems ได้ แต่จะขอไม่กล่าวถึงในที่นี้ว่าทำได้อย่างไรบ้าง

ในระบบของ Jini มีองค์ประกอบอยู่ 3 ส่วนที่เป็นหลักที่สำคัญ ส่วนแรกก็คือ Service ตัวอย่างของ Service ก็เช่น เครื่อง Printer เครื่องปิ้งขนมปัง หรือแม้แต่เป็น ซอฟต์แวร์โปรแกรมเช่น โปรแกรมแปลง ฟอร์แมตไฟล์ เป็นตัน ส่วนที่สองคือ Client ซึ่งมาเรียกใช้บริการของ Service ต่าง ๆ ในระบบ และส่วนสุดท้ายคือ Lookup Service ซึ่งทำหน้าที่เป็นตัวกลางระหว่าง Service และ Client และยังมีส่วนประกอบที่สำคัญอีกตัวหนึ่งคือระบบเครือข่ายที่ทำการเชื่อมองค์ประกอบสำคัญทั้งสามส่วนเข้าด้วยกัน และระบบเครือข่ายที่ใช้สำหรับ Jini นั้น ปรกติแล้วจะทำงานอยู่บนเครือข่ายด้วย TCP/UDP ของ Socket Protocol ( ตามข้อกำหนดและหลักการทำงานของ Jini นั้น สามารถทำงานได้โดยไม่ขึ้นกับ Protocol แต่ในปัจจุบัน Jini Network ที่ถูกสร้างขึ้นนั้น ส่วนใหญ่ทำงานกับ Java RMI ซึ่งเราสามารถสร้าง Jini Network สำหรับ โพรโตคอล อื่น ๆ ได้ )



รูปที่ 2-1 องค์ประกอบของ Jini Network


            โค้ดของจาวา สามารถเคลื่อนย้ายระหว่างองค์ประกอบทั้ง 3 ได้ ด้วยกระบวนการออบเจ็กต์ซีเรียลไลซิง และใช้จาวาซ๊อกเก็ตในการส่งและรับออบเจ็กต์มาจากเครือข่าย ซึ่งออบเจ็กต์ที่อยู่ใน JVM หนึ่งสามารถเรียกใช้ Method ของออบเจ็กต์ที่อยู่ในอีก JVM หนึ่งได้โดยกระบวนการของ Java RMI ถึงแม้ว่า Jini Specification จะไม่จำเป็นต้องใช้ Java RMI แต่การเรียกใช้ Java RMI นั้นทำให้การทำงานของ Jini นั้นง่ายขึ้น

2.3 Service ของ Jini

2.3.1 การลงทะเบียน Service


            ตัว Service ที่แท้จริงของระบบ Jini ก็คือออบเจ็กต์หรือกลุ่มของออบเจ็กต์ที่ถูกสร้างขึ้นมาภายในเครื่อง Computer Server ซึ่ง Server จะต้องทำหน้าที่ที่สำคัญ  คือ การลงทะเบียน Service ไปยัง Lookup Service ในกระบวนการการลงทะเบียนนี้ Server จะต้องทำการค้นหา Lookup Service เป็นอันดับแรก ซึ่งกระบวนการนี้สามารถทำได้ 2 วิธีคือ ถ้าหากเรารู้ตำแหน่งที่แน่นอน ( IP Address ) ของ Lookup Service แล้ว Server สามารถใช้การทำ Unicast Request ส่งผ่าน TCP Protocol ในการเชื่อมต่อโดยตรงไปยัง Lookup Service แต่ถ้าหาก ไม่รู้ว่า Lookup Service นั้นทำงานอยู่ที่ใดในเครือข่าย Server สามารถทำการ Multicast Request ส่งผ่าน UDP Protocol ไปยังเครือข่าย เมื่อ Lookup Service ได้รับ คำร้องนั้น ( Request ) ตัว Lookup Service ก็จะส่งออบเจ็กต์กลับไปยัง Server ซึ่งออบเจ็กต์นี้เราเรียกว่า Registrar Object ที่ทำหน้าที่เป็น Proxy ไปยัง Lookup Service การ Request สิ่งต่าง ๆ ไปยัง Lookup Service จะทำผ่านออบเจ็กต์ตัวนี้ ซึ่งกระบวนการที่ Registrar Object ทำการติดต่อกลับไปยัง Lookup Service นั้น สามารถทำผ่าน Protocol ใด ๆ ก็ได้ แต่วิธีที่ง่ายที่สุดวิธีหนึ่งก็คือการทำงานผ่าน Java RMI

กระบวนการที่ Server จะทำการลงทะเบียน Service ไปยัง Lookup Service นั้น คือ Server จะทำการส่งสำเนาของ Service Object ไปเก็บไว้ที่ Lookup Service



รูปที่ 2-2 Service ทำการค้นหา Lookup Service



รูปที่ 2-3 Lookup Service ตอบรับด้วย registrar object



รูปที่ 2-4 Service ส่ง Service Proxy ไปลงทะเบียนที่ Lookup Service


จากกระบวนการที่แสดงนี้ Service Object ตัวเดิมก็ยังคงทำงานอยู่ที่ Server แต่ Service Proxy ที่เก็บอยู่ที่ Lookup Service นั้นเป็นแค่สำเนาของ Service Object ของ Server เท่านั้น ซึ่ง Client ก็จะนำสำเนาของ Service Proxy นี้ไปจาก Lookup Service และทำการเรียกใช้บริการต่าง ๆ ของ Service ผ่านทาง Service Proxy ซึ่งอยู่บน JVM ฝังเดียวกับ Client ของตัวเอง

2.3.2 Service Proxy




รูปที่ 2-5 Service Proxy


            อาจจะเกิดคำถามมาว่า เมื่อ Service Proxy ไม่ใช่ Service Object จะรู้ได้อย่างไรว่าตัว Service นั้นอยู่ที่ไหน ในระบบ Jini Network ไม่ได้มีการกำหนดไว้เป็นวิธีที่ตายตัวว่าจะต้องทำอย่างไร แต่ก็มีหลายวิธีที่จะทำให้ Service Proxy นั้นสามารถรู้จักกับ Service ของตัวเอง ตัวอย่างเช่น การใช้กระบวนการของ Java RMI ในการสร้าง Service Proxy ก่อนที่จะส่งไปลงทะเบียน กับ Lookup Service ก็ทำการใส่ Reference ของ Service Object เข้าไปยัง Service Proxy ผ่าน Serializable Object ตาม Style ของ Java Beans เพื่อให้สามารถ Reference ผ่าน Java RMI กลับมายัง Service ได้ หรือแม้กระทั่ง Service ทำการใส่ค่า IP Address และ Port ของตนเองลงไปใน Service Proxy ผ่าน Serializable Object ตาม Style ของ Java Beans เช่นกัน เพื่อให้สามารถเชื่อมต่อผ่าน Socket Protocol กลับมายัง Service ได้อีกวิธีทีหนึ่ง เป็นต้น

2.3.3 โครงสร้างการทำงานของ Service


            โครงสร้างของ Service จะมีกระบวนการภายใน ซึ่งทำการติดต่อกับ Lookup Service แล้วทำการลงทะเบียน Service Proxy ไว้กับ Lookup Service กระบวนการซึ่งแสดงได้ดัง ซูโดโค้ด ( Pseudo Code ) ต่อไปนี้ เตรียมตัวในการค้นหา Lookup Service  การสร้างข้อมูลเกี่ยวกับ Service ( Entry Object ) ส่งสำเนาของ Service Proxy ไปยัง Lookup Service การ Renew Lease ตามเวลาที่กำหนด ( จะกล่าวถึงในบทที่ 5 )  ตัวอย่างโปรแกรมด้านล่างนี้เป็นตัวอย่างของ Service ที่ชื่อ FileClassifier Service ซึ่งทำการตรวจสอบว่าไฟล์ที่ Client ส่งมานั้นมีชนิดของไฟล์คืออะไร แล้วทำการส่งผลลัพท์กลับไปยัง Client ซึ่งโปรแกรมนี้ไม่สนใจในเรื่องการตรวจสอบความผิดพลาด ( Exception ) และจะยังไม่มีการอธิบายการทำงานของโปรแกรมนี้ ในบทนี้ เพียงแต่สาธิตการแปลงซูโดโค้ด ด้านบนให้เป็นโปรแกรมเท่านั้น

public class FileClassifierServer implements DiscoveryListener   {

    protected LeaseRenewalManager leaseManager = new LeaseRenewalManager();

    public static void main( String argv[] )   {

        new FileClassifierServer();

        // keep server running (almost) forever to
        // - allow time for locator discovery and
        // - keep re-registering the lease

        Thread.currentThread().sleep( Lease.FOREVER );
    }

    public FileClassifierServer()   {

        LookupDiscovery discover = null;

        // Prepare for discovery - empty here
        // Discover a lookup service
        // This uses the asynchronous multicast protocol,
        // which calls back into the discovered() method

        discover = new LookupDiscovery( LookupDiscovery.ALL_GROUPS );
        discover.addDiscoveryListener( this );
    }

    public void discovered( DiscoveryEvent evt )   {

        ServiceRegistrar registrar = evt.getRegistrars() [ 0 ];

        // At this point we have discovered a lookup service
        // Create information about a service ServiceItem

        item = new ServiceItem( null, new FileClassifierImpl(), null );

        // Export a service ServiceRegistration

        reg = registrar.register( item, Lease.FOREVER );

        // Renew leasing leaseManager.renewUntil( reg.getLease(), Lease.FOREVER, this );
    }
}

// FileClassifierServer

2.4 Client ของ Jini


2.4.1 การค้นหา Lookup Service ของ Client


กระบวนการที่ Client ทำการค้นหา Lookup Service นั้น จะใช้กระบวนการเดียวกับ Service ในการค้นหา Lookup Service โดยที่เมื่อ Client สามารถค้นหา Lookup Service พบแล้ว และต้องการจะเรียกใช้ Service จาก Jini Network โดย Client ต้องทำการสอบถามเข้าไปที่ Lookup Service เพื่อค้นหา Service ที่ต้องการ การค้นหา Service นั้น Client จะใช้การสร้าง Template ในการค้นหาขึ้นแล้วทำการเรียกใช้ Method ชื่อ lookup() ไปยัง Lookup Service ผ่านทางรีจิสทราออบเจ็กต์ที่ได้รับมาโดยส่ง Template ในการค้นหาไปเป็นพารามิเตอร์และเมื่อ Lookup Service ค้นหา Service ที่ Client ต้องการพบ ก็จะทำการส่งสำเนาหรือ Service Proxy ของ Service นั้นกลับไปยัง Client



รูปที่ 2-6 Client ได้รับ Service Proxy


เมื่อ Client ได้รับ Service Proxy แล้ว การที่ Client จะเรียกใช้บริการจาก Service นั้น Client สามารถทำได้โดยตรงจากการเรียกใช้ Method ของ Server Proxy ไปยัง Service Object โดยที่กระบวนการเรียกใช้ Service นี้ Client จะทำงานโดยตรงกับ Service โดยที่ไม่จำเป็นต้องเรียกผ่านไปยัง Lookup Service อีกต่อไป





รูปที่ 2-7 Client ติดต่อกับ Service ผ่าน Service Proxy


2.4.2 โครงสร้างการทำงานของ Client


โครงสร้างของ Client ของ Lookup Service จะมีกระบวนการทำงานภายใน ในการติดต่อกับ Jini Network โดยแสดงให้เป็นเป็น ซูโดโค้ด ดังนี้
  • เตรียมตัวในการค้นหา Lookup Service
  • ทำการค้นหา Lookup Service
  • เตรียม Template สำหรับค้นหา Service ที่ต้องการใน Lookup Service
  • ค้นหา Service ใน Lookup Service
  • เรียกใช้บริการ Service
ตัวอย่างโปรแกรมด้านล่างนี้เป็น ตัวอย่างของ Client ที่ทำการเรียกใช้ Service ที่ชื่อ FileClassifier โดยที่ Client ทำการค้นหา Service ที่ชื่อ FileClassifier แล้วทำการเรียกใช้ Method ที่ชื่อ getMIMEType() ของ Service โดยที่โปรแกรมนี้ไม่สนใจในเรื่องการตรวจสอบความผิดพลาด (Exception) และจะยังไม่มีการอธิบายการทำงานของโปรแกรมนี้ ในบทนี้ โปรแกรมนี้เพียงแต่สาธิตการแปลงซูโดโค้ดด้านบนให้เป็นโปรแกรมเท่านั้น

public class TestUnicastFileClassifier   {

    public static void main( String argv[] )   {

        new TestUnicastFileClassifier();
    }

    public TestUnicastFileClassifier()   {

        LookupLocator lookup = null;
        ServiceRegistrar registrar = null;
        FileClassifier classifier = null;

        // Prepare for discovery

        lookup = new LookupLocator( "jini://www.jiniworld.com" );

        // Discover a lookup service
        // This uses the synchronous unicast protocol

        registrar = lookup.getRegistrar();

        // Prepare a template for lookup search

        Class[] classes = new Class[] { FileClassifier.class };
        ServiceTemplate template = new ServiceTemplate( null, classes, null );

        // Lookup a service classifier = ( FileClassifier ) registrar.lookup( template );
        // Call the service

        MIMEType type;
        type = classifier.getMIMEType( "file1.txt" );
        System.out.println( "Type is " + type.toString() );
    }
}

// TestUnicastFileClassifier






Last update : June 17, 2009 17:00 ( Thailand )

Apple, Mac, iMac, iPhone and iPod are trademarks of Apple, Inc.

Jini, Java and all Java-based are trademarks of Sun Microsystems, Inc.



JiniSoft Corporation

Copyright @ 1990 - 2009   Mr. Roongroj Rojanapo ( )

99/2 Soi Ramindra 14, Ramindra Road, Bangkane, Bangkok 10230, Thailand


E-mail : roongroj @ mac.com
SMS : 081 615-5135  ( iPhone )
FAX : 02   943-6433