บทที่ 2
Jini Network Concept
2.1 ภาพรวมของ Jini Network
Jini
คือชื่อของระบบออบเจ็กต์แบบกระจายตัวหนึ่ง โดยมีคุณสมบัตที่เรียกว่า Network Plug
and Play อุปกรณ์ต่าง ๆ ไม่ว่าจะเป็นซอฟต์แวร์หรือฮาร์แวร์สามารถเชื่อมต่อกับระบบ
แล้วทำการแจ้งให้ระบบทราบถึงการมาของตน ฝัง Client ที่ต้องการจะเรียกใช้บริการต่าง ๆ
บนเครือข่ายสามารถที่จะค้นหาบริการนั้นจากเครือข่ายแล้วทำการเรียกใช้บริการจากผู้ให้บริการนั้นได้
ซึ่งระบบนี้เหมาะกับเครือข่ายที่มีความเปลี่ยนแปลงตลอดเวลา ( Dynamic
) ตัวอย่างสถานการณ์ที่เหมาะสมกับการใช้ Jini Network ก็คือ
-
มีเครื่อง Printer
มาเชื่อมต่อกับเครือข่ายและได้แจ้งให้กับระบบรู้ถึงการเชื่อมต่อของตน
และประสิทธิภาพของเครื่องที่ทำได้ ซึ่ง Client สามารถเรียกใช้เครื่อง Printer
เครื่องนี้ในการพิมพ์งานได้ทันที โดยไม่ต้องมีการปรับแต่งอะไรเลย
-
มีกล้องถ่ายรูปแบบดิจิตอลมาเชื่อมต่อกับเครือข่ายแล้วต้องการจะขอใช้บริการการพิมพ์จากเครื่อง
Printer สามารถขอใช้บริการได้เลยโดยที่ไม่ต้องมีการติดตั้ง ไดรเวอร์ของเครื่อง
Printer
-
อุปกรณ์ใหม่ๆสามารถเพิ่มเติมเข้ามาในระบบได้ โดยที่ไม่ต้องมีการหยุดการทำงานของระบบและไม่ต้องมีการกลับมาปรับแต่งอะไรกับระบบเครือข่ายอีก
-
ผู้ให้บริการสามารถแจ้งกับระบบได้ถึงการเปลี่ยนแปลงสถานะบางอย่างของระบบ เช่น
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
|