มันจะง่ายที่สุดถ้าส่วนประกอบทั้งหมดถูกดำเนินการบนพื้นที่ฮีปเดียวกันของเครื่องเสมือน Java เดียวกันบนคอมพิวเตอร์เครื่องเดียวกัน แต่ในทางปฏิบัติเรามักจะไม่ต้องเผชิญกับสถานการณ์เดียวเช่นนี้ หากไคลเอนต์เป็นเพียงอุปกรณ์ที่สามารถรัน Java ได้ ทำ? จะเกิดอะไรขึ้นถ้าด้วยเหตุผลด้านความปลอดภัยเฉพาะโปรแกรมบนเซิร์ฟเวอร์เท่านั้นที่สามารถเข้าถึงฐานข้อมูลได้?
เรารู้ว่าในกรณีส่วนใหญ่ การเรียกใช้เมธอดจะเกิดขึ้นระหว่างสองออบเจ็กต์บนฮีปเดียวกัน จะเป็นอย่างไรถ้าคุณต้องการเรียกใช้เมธอดบนออบเจ็กต์บนเครื่องที่แตกต่างกัน
โดยปกติแล้วเราจะรับข้อมูลจากคอมพิวเตอร์เครื่องหนึ่งไปยังคอมพิวเตอร์อีกเครื่องหนึ่งผ่านทางอินพุต/เอาท์พุตของซ็อกเก็ต เปิดการเชื่อมต่อซ็อกเก็ตของคอมพิวเตอร์อีกเครื่อง แล้วรับเอาต์พุตสตรีมเพื่อเขียนข้อมูล แต่หากเราต้องการเรียกคอมพิวเตอร์เครื่องอื่นมาที่เครื่องของคุณ คอมพิวเตอร์ อะไรคือวิธีการของวัตถุบนเครื่องเสมือน Java อื่น? แน่นอนว่าเราสามารถกำหนดและออกแบบโปรโตคอลการสื่อสารเองเพื่อเรียก แล้วส่งผลการดำเนินการกลับมาผ่าน Socket ได้ และยังสามารถเป็นเหมือนการเรียกวิธีการบนเครื่องโลคอลได้ กล่าวคือ หากเราต้องการเรียกวัตถุระยะไกล (เช่น เช่นเดียวกับฮีปอื่นๆ) ) แต่ควรเป็นเหมือนการโทรปกติ
นี่คือสิ่งที่ RMI นำมาให้เรา
การออกแบบการเรียกโพรซีเดอร์ระยะไกล
มี 4 สิ่งที่ต้องสร้าง: เซิร์ฟเวอร์ ไคลเอนต์ สิ่งอำนวยความสะดวกเสริมเซิร์ฟเวอร์ และสิ่งอำนวยความสะดวกเสริมไคลเอนต์
1. สร้างแอปพลิเคชันไคลเอ็นต์และเซิร์ฟเวอร์ แอปพลิเคชันเซิร์ฟเวอร์เป็นบริการระยะไกล ซึ่งเป็นออบเจ็กต์ที่มีวิธีการที่ไคลเอ็นต์จะเรียกใช้
2. สร้างตัวช่วยฝั่งไคลเอ็นต์และเซิร์ฟเวอร์ พวกเขาจะจัดการรายละเอียดอินพุต/เอาท์พุตเครือข่ายที่สำคัญของไคลเอ็นต์และเซิร์ฟเวอร์ ทำให้ไคลเอ็นต์และโปรแกรมดูเหมือนกำลังประมวลผลการโทรในท้องถิ่น
งานของสิ่งอำนวยความสะดวกเสริมคือวัตถุที่ทำการสื่อสารจริง ๆ พวกเขาทำให้ลูกค้ารู้สึกราวกับว่ากำลังเรียกวัตถุในเครื่อง พร็อกซีที่จัดการซ็อกเก็ตและรายละเอียดการสตรีมในเครื่อง บนฝั่งเซิร์ฟเวอร์ สิ่งอำนวยความสะดวกเสริมของเซิร์ฟเวอร์จะเชื่อมต่อคำขอจากสิ่งอำนวยความสะดวกไคลเอนต์ผ่านซ็อกเก็ต แยกวิเคราะห์ข้อมูลที่บรรจุไว้ จากนั้นเรียกใช้บริการจริง ดังนั้นสำหรับออบเจ็กต์บริการ นี่คือหลังจาก การเรียกสิ่งอำนวยความสะดวกเสริมจากบริการในพื้นที่ จะได้รับค่าที่ส่งคืน ล้อมรอบและส่งกลับ (ผ่านสตรีมเอาท์พุตของซ็อกเก็ต) ไปยังสิ่งอำนวยความสะดวกเสริมของไคลเอ็นต์
กระบวนการเรียกเมธอด
1. อ็อบเจ็กต์ไคลเอ็นต์เรียก doBigThing() บนอ็อบเจ็กต์สิ่งอำนวยความสะดวกเสริม
2. สิ่งอำนวยความสะดวกเสริมของลูกค้าจะจัดแพคเกจข้อมูลการโทรและส่งไปยังสิ่งอำนวยความสะดวกเสริมของเซิร์ฟเวอร์ผ่านเครือข่าย
3. สิ่งอำนวยความสะดวกเสริมฝั่งเซิร์ฟเวอร์ถอดรหัสข้อมูลจากสิ่งอำนวยความสะดวกเสริมฝั่งไคลเอ็นต์ และใช้เพื่อเรียกใช้บริการจริง
แผนภาพที่อธิบายกระบวนการนี้มีดังนี้:
JavaRMI จัดเตรียมอ็อบเจ็กต์ตัวช่วยฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์
ใน Java RMI ได้ช่วยเราสร้างสิ่งอำนวยความสะดวกเสริมฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ นอกจากนี้ยังรู้วิธีทำให้สิ่งอำนวยความสะดวกเสริมฝั่งไคลเอ็นต์ดูเหมือนบริการจริง กล่าวอีกนัยหนึ่ง RMI รู้วิธีจัดเตรียมวิธีการเดียวกันสำหรับการเรียกไคลเอ็นต์ .
นอกจากนี้ RMI ยังมีโครงสร้างพื้นฐานทั้งหมดที่จำเป็นสำหรับการดำเนินการ รวมถึงการสอบถามบริการและสิ่งอำนวยความสะดวกเสริมที่ช่วยให้ลูกค้าสามารถค้นหาและรับลูกค้า (ตัวแทนบริการจริง)
เมื่อใช้ RMI ไม่จำเป็นต้องเขียนโปรแกรมเครือข่ายหรืออินพุต/เอาท์พุตใดๆ การเรียกไคลเอ็นต์ไปยังเมธอดระยะไกลจะเหมือนกับการเรียกเมธอดบนเครื่องเสมือน Java เดียวกัน
การโทรทั่วไปจะแตกต่างจากการโทร RMI เล็กน้อย แม้ว่าการเรียกเมธอดนี้จะดูเป็นแบบท้องถิ่น แต่ระบบเสริมของไคลเอ็นต์จะทำการโทรผ่านเครือข่ายในที่สุด และเอเจนต์จะแปลงเป็นรีโมต วิธีการส่งข้อมูลระดับกลางจากเครื่องเสมือน Java ไปยังเครื่องเสมือน Java ขึ้นอยู่กับโปรโตคอลที่ใช้โดยอ็อบเจ็กต์สิ่งอำนวยความสะดวกเสริม
เมื่อใช้ RMI คุณต้องตัดสินใจเลือกโปรโตคอล: JRMP หรือ IIOP JRMP เป็นโปรโตคอลดั้งเดิมของ RMI มันถูกออกแบบมาสำหรับการโทรระยะไกลระหว่าง Java สำหรับอ็อบเจ็กต์หรือวิธีการระยะไกลประเภทอื่นๆ CORBA มักจะมีปัญหามากกว่า RMI เพราะหากปลายทั้งสองไม่ใช่ Java การดำเนินการแปลและการสนทนาที่แย่มากจะเกิดขึ้นมากมาย
เราสนใจเฉพาะการดำเนินการระหว่าง Java ถึง Java เท่านั้น ดังนั้นเราจะใช้ RMI ที่ค่อนข้างง่าย
ใน RMI สิ่งอำนวยความสะดวกเสริมฝั่งไคลเอ็นต์เรียกว่า stubs และสิ่งอำนวยความสะดวกเสริมฝั่งเซิร์ฟเวอร์เรียกว่าโครงกระดูก
วิธีสร้างบริการระยะไกล
1.สร้างอินเทอร์เฟซระยะไกล
อินเทอร์เฟซระยะไกลกำหนดวิธีการที่ไคลเอนต์สามารถเรียกจากระยะไกล เป็นคลาส polymorphic เป็นบริการ ทั้ง stub และบริการจะใช้อินเทอร์เฟซนี้
2. ใช้อินเทอร์เฟซระยะไกล
นี่คือคลาสการดำเนินการจริง โดยใช้วิธีการที่กำหนดไว้บนอินเทอร์เฟซ
3. ใช้ rmic เพื่อสร้าง stub และ skeleton
ทั้งไคลเอนต์และเซิร์ฟเวอร์ต่างก็มีตัวช่วย เราไม่จำเป็นต้องสร้างคลาสเหล่านี้หรือสร้างซอร์สโค้ดของคลาสเหล่านี้
4. เริ่มการลงทะเบียน RMI (rmiregistry)
rmiregistry เปรียบเสมือนสมุดโทรศัพท์ ผู้ใช้จะได้รับพรอกซี (วัตถุต้นขั้ว/ตัวช่วยของลูกค้า) จากที่นี่
5. เริ่มบริการระยะไกล
วัตถุบริการจะต้องเริ่มดำเนินการ คลาสที่ใช้บริการจะเริ่มอินสแตนซ์บริการและลงทะเบียนกับ RMIRegistry หลังจากลงทะเบียนแล้วเท่านั้นที่สามารถให้บริการผู้ใช้ได้
รหัสเซิร์ฟเวอร์
กำหนดอินเทอร์เฟซ
-
-
*MyRemote.java
-
* ฟังก์ชั่น: TODO
* ชื่อคลาส: MyRemote.java
-
* ver. อัปเดตเจ้าของตัวละครและเนื้อหาใหม่
*
* V1.00 19-3-2556 เวอร์ชันแรกของโมดูล Su Ruo
-
* ลิขสิทธิ์ (c) 2013 บริษัท dennisit สงวนลิขสิทธิ์
-
* อีเมล:<a href="mailto:[email protected]">ส่งอีเมล</a>
-
-
* Remote เป็นอินเทอร์เฟซที่ทำเครื่องหมายไว้ ซึ่งหมายความว่าไม่มีวิธีการใดๆ อย่างไรก็ตาม มันมีความหมายพิเศษสำหรับ RMI ดังนั้นจึงต้องปฏิบัติตามกฎนี้
* โปรดทราบว่ามีการใช้ส่วนขยายที่นี่ และอินเทอร์เฟซสามารถสืบทอดอินเทอร์เฟซอื่นได้
-
-
อินเทอร์เฟซสาธารณะ MyRemote ขยายระยะไกล {
-
* อินเทอร์เฟซระยะไกลกำหนดวิธีการที่ไคลเอนต์สามารถเรียกจากระยะไกลได้ มันเป็นคลาส polymorphic ที่เป็นบริการ กล่าวคือ ไคลเอนต์จะ
* ระดม stub ที่ใช้อินเทอร์เฟซนี้ และเนื่องจาก stub นี้จะทำงานด้านเครือข่ายและอินพุต/เอาท์พุต สิ่งต่างๆ อาจเกิดขึ้นได้
* ปัญหา ลูกค้าจะจัดการหรือประกาศข้อยกเว้นเพื่อรับรู้ความเสี่ยงประเภทนี้ หากวิธีการประกาศข้อยกเว้นในอินเทอร์เฟซ ให้เรียกใช้วิธีการ
* ขั้นตอนทั้งหมดจะต้องจัดการหรือประกาศข้อยกเว้นนี้อีกครั้ง
-
* พารามิเตอร์และค่าส่งคืนของวิธีการระยะไกลจะต้องเป็นแบบดั้งเดิมหรือแบบอนุกรมได้
* แพ็คเกจถูกส่งผ่านเครือข่าย และเมื่อเสร็จสิ้นผ่านการซีเรียลไลซ์ ค่าที่ส่งคืนจะเท่ากัน ดังนั้น หากใช้ประเภทแบบกำหนดเอง
* จะต้องซีเรียลไลซ์
* @กลับ
* @ พ่น RemoteException
* วิธีการทั้งหมดในอินเทอร์เฟซจะต้องประกาศ RemoteException
-
สตริงสาธารณะ sayHello() พ่น RemoteException;
-
-
-
*MyRemoteImpl.java
-
* ฟังก์ชั่น: TODO
* ชื่อคลาส: MyRemoteImpl.java
-
* ver. อัปเดตเจ้าของตัวละครและเนื้อหาใหม่
*
* V1.00 19-3-2556 เวอร์ชันแรกของโมดูล Su Ruo
-
* ลิขสิทธิ์ (c) 2013 บริษัท dennisit สงวนลิขสิทธิ์
-
* อีเมล:<a href="mailto:[email protected]">ส่งอีเมล</a>
-
* เพื่อให้กลายเป็นวัตถุบริการระยะไกล วัตถุต้องมีฟังก์ชันที่เกี่ยวข้องกับระยะไกล วิธีที่ง่ายที่สุดคือการสืบทอด UnicastRemoteObject
* (จาก java.rmi.server) เพื่อให้คลาสพาเรนต์นี้จัดการงาน
-
-
คลาสสาธารณะ MyRemoteImpl ขยาย UnicastRemoteObject ใช้งาน MyRemote {
-
* Constructor ของคลาสพาเรนต์ประกาศข้อยกเว้น ดังนั้นคุณต้องเขียน Constructor เพราะมันหมายความว่า Constructor ของคุณจะเรียกโค้ดโปรแกรมที่มีความเสี่ยง
-
* UnicastRemoteObject มีปัญหาเล็กน้อย Constructor จะส่ง RemoteException วิธีเดียวที่จะจัดการได้
* ประกาศ Constructor สำหรับการนำไปใช้งานของคุณเองเพื่อให้มีที่สำหรับประกาศ RemoteException เมื่อคลาสถูกเตรียมใช้งาน คลาสพาเรนต์
* Constructor จะถูกเรียกอย่างแน่นอน หาก Constructor ของคลาสพาเรนต์ส่งข้อยกเว้น ตัวสร้างแบบกำหนดเองที่เราจะต้องประกาศก็จะส่งข้อยกเว้นด้วย
* @ พ่น RemoteException
-
ป้องกัน MyRemoteImpl() พ่น RemoteException {
-
-
* ใช้วิธีการทั้งหมดของอินเทอร์เฟซขาออก แต่ไม่จำเป็นต้องประกาศ RemoteException
-
@แทนที่
สตริงสาธารณะ sayHello(){
กลับ "เซิร์ฟเวอร์บอกว่า rmi สวัสดีชาวโลก!";
-
โมฆะสาธารณะคงหลัก (สตริง [] args) {
พยายาม {
-
* เรามีบริการระยะไกลอยู่แล้ว และเราต้องอนุญาตให้ผู้ใช้ระยะไกลเข้าถึงได้ ซึ่งสามารถทำได้โดยการเริ่มต้นและเพิ่มลงใน RMI Registry
* (จะต้องทำงานอยู่มิฉะนั้นโปรแกรมนี้จะไม่ทำงาน) เมื่อลงทะเบียนวัตถุระบบ RMI จะเพิ่ม stub ลงในรีจิสทรี
* เพราะนี่คือสิ่งที่ลูกค้าต้องการ ใช้ rebind() ของ java.rmi.Naming เพื่อลงทะเบียนบริการ
-
บริการ MyRemote = MyRemoteImpl ใหม่ ();
-
* สร้างวัตถุระยะไกล จากนั้นใช้ Naming.rebind() แบบคงที่เพื่อสร้างการเชื่อมโยง ชื่อที่ลงทะเบียนไว้จะถูกจัดเตรียมไว้สำหรับการสืบค้นของไคลเอ็นต์
-
Naming.rebind("Remote Hello World", บริการ);
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
-
ผู้บริหารโมฆะสาธารณะ () {
พยายาม {
-
* ไคลเอนต์จะต้องได้รับวัตถุ stub เนื่องจากไคลเอนต์จะต้องเรียกใช้วิธีการของมัน ขึ้นอยู่กับรีจิสทรี RMI
* ค้นหาไดเรกทอรีเดียวกันเพื่อค้นหาบริการที่มีชื่อตรงกัน
* ไคลเอนต์สอบถาม RMIRegistry และส่งกลับวัตถุ stub
* Naming.lookup("rmi://127.0.0.1/Remote Hello World");
* คำอธิบายพารามิเตอร์
* rmi://127.0.0.1/รีโมท สวัสดีชาวโลก
* 127.0.0.1 หมายถึงชื่อโฮสต์หรือที่อยู่ IP ของโฮสต์
* Remote Hello World จะต้องเหมือนกับชื่อที่ลงทะเบียนไว้
-
-
บริการ MyRemote = (MyRemote)Naming.lookup("rmi://127.0.0.1/Remote Hello World");
สตริง tmp = service.sayHello();
System.out.println(tmp);
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
โมฆะสาธารณะคงหลัก (สตริง [] args) {
ใหม่ MyRemoteClient().exec();
-
-
เครื่องมือ rmic ที่มาพร้อมกับ JDK จะสร้างสองคลาส ได้แก่ stub และ skeleton โดยขึ้นอยู่กับการใช้งานบริการ โดยจะเพิ่ม _Stub หรือ _Skeleton หลังชื่อการใช้งานระยะไกลตามกฎการตั้งชื่อ rmic มีหลายตัวเลือก รวมถึงการไม่สร้างโครงกระดูก การสังเกตซอร์สโค้ดของคลาสที่สร้างขึ้น หรือใช้ IIOP เป็นโปรโตคอลการสื่อสาร คลาสที่สร้างขึ้นจะถูกวางไว้ในไดเร็กทอรีปัจจุบัน โปรดจำไว้ว่า rmic จะต้องสามารถค้นหาคลาสที่นำไปใช้ได้ ดังนั้น คุณอาจต้องดำเนินการ rmic จากไดเร็กทอรีที่มีการใช้งานอยู่ (ในทางปฏิบัติ คุณอาจต้องพิจารณาโครงสร้างไดเร็กทอรีแพ็กเกจและชื่อเต็ม เพื่อความง่าย จะไม่มีการใช้แพ็กเกจที่นี่)
เรียกบรรทัดคำสั่งเพื่อเริ่ม rmiregistry ตรวจสอบให้แน่ใจว่าคุณเริ่มต้นจากไดเร็กทอรีที่สามารถเข้าถึงคลาสได้ วิธีที่ง่ายที่สุดคือการรันจากไดเร็กทอรีของคลาส
ภาพหน้าจอการทำงานมีดังนี้
สังเกต:
ไคลเอนต์ใช้อินเทอร์เฟซเพื่อเรียกเมธอดบน stub เครื่องเสมือน Java ของไคลเอนต์ต้องมีคลาส stub แต่ไคลเอนต์จะไม่อ้างอิงคลาส stub ในโค้ดโปรแกรมเสมอ
เซิร์ฟเวอร์จะต้องมี stub และโครงกระดูก รวมถึงบริการและอินเทอร์เฟซระยะไกล โดยต้องใช้คลาส stub เนื่องจาก stub จะถูกแทนที่ด้วยบริการจริงที่เชื่อมต่อกับ RMIRegistry
ข้อผิดพลาดทั่วไปเมื่อใช้ RMI:
1. ลืมเริ่ม rmiregistry ก่อนเริ่มบริการระยะไกล (ต้องเริ่ม rmiregistry ก่อนใช้ Naming.rebind() เพื่อลงทะเบียนบริการ)
2. ลืมทำให้พารามิเตอร์และประเภทการส่งคืนเป็นแบบอนุกรม (จะไม่ถูกตรวจพบในระหว่างการคอมไพล์ และจะถูกค้นพบระหว่างการดำเนินการเท่านั้น)
3. ลืมมอบคลาส stub ให้กับลูกค้า
RMI เหมาะมากสำหรับการเขียนและเรียกใช้บริการระยะไกล แต่เราจะไม่ใช้ RMI เพียงอย่างเดียวในการดำเนินการบริการเว็บไซต์ สำหรับแอปพลิเคชันระดับองค์กรขนาดใหญ่ เราต้องการฟังก์ชันที่มากขึ้นและดีขึ้น เช่น การจัดการธุรกรรม การประมวลผลพร้อมกันขนาดใหญ่ และความปลอดภัย และการจัดการฐานข้อมูล เป็นต้น ซึ่งต้องใช้ EnterpriseApplicationServer
เซิร์ฟเวอร์ JavaEE ประกอบด้วยเว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ Enterprise JavaBeans (EJB) เซิร์ฟเวอร์ EJB ทำหน้าที่ระหว่างการเรียก RMI และเลเยอร์บริการ
การประยุกต์ใช้ RMI ใน JINI
Jini ยังใช้ RMI (แม้ว่าจะสามารถใช้โปรโตคอลอื่นได้ก็ตาม) แต่ก็มีฟังก์ชันหลักอีกหลายฟังก์ชัน
1. การค้นพบแบบปรับเปลี่ยนได้
2. เครือข่ายการรักษาตนเอง
ไคลเอ็นต์ RMI ต้องได้รับที่อยู่และชื่อของบริการระยะไกลก่อน รหัสโปรแกรมแบบสอบถามของไคลเอ็นต์จะต้องมีที่อยู่ IP หรือชื่อโฮสต์ของบริการระยะไกล (เนื่องจาก RMIRegistry อยู่บนนั้น) และชื่อที่ลงทะเบียนโดยบริการ
แต่เมื่อใช้ JINI ผู้ใช้จำเป็นต้องรู้เพียงสิ่งเดียวเท่านั้น นั่นคืออินเทอร์เฟซที่ใช้บริการ!
Jini ใช้บริการค้นหาซึ่งมีความแข็งแกร่งและปรับเปลี่ยนได้ดีกว่า RMIRegistry เนื่องจาก Jini จะโฆษณาบนเครือข่ายโดยอัตโนมัติ เมื่อบริการสืบค้นออนไลน์จะใช้เทคโนโลยี IP multicast เพื่อส่งข้อมูลไปยังเครือข่ายทั้งหมด ไม่เพียงเท่านั้น หากไคลเอนต์ จะออนไลน์หลังจากออกอากาศบริการสืบค้นแล้ว และลูกค้ายังสามารถส่งข้อความไปยังเครือข่ายทั้งหมดเพื่อสอบถามได้อีกด้วย
เมื่อบริการออนไลน์ จะสำรวจบริการสืบค้น JINI บนเครือข่ายแบบไดนามิกและสมัครเพื่อลงทะเบียน เมื่อลงทะเบียน บริการจะส่งอ็อบเจ็กต์ซีเรียลไลซ์ไปยังบริการสืบค้น ไดรเวอร์ของอุปกรณ์เครือข่าย หรือแม้แต่บริการที่สามารถดำเนินการบนไคลเอนต์ได้ และสิ่งที่ลงทะเบียนไว้คืออินเทอร์เฟซที่นำไปใช้งาน
วิธีการทำงานของการสำรวจแบบปรับเปลี่ยนได้
1.บริการสืบค้น Jini เริ่มต้นบนเครือข่ายและใช้เทคโนโลยี IP multicast เพื่อโปรโมตตัวเอง
2. บริการ Jini อื่นที่เริ่มต้นแล้วจะพยายามลงทะเบียนกับบริการสืบค้นที่เพิ่งเริ่มต้น โดยจะลงทะเบียนฟังก์ชันแทนชื่อ นั่นคือ อินเทอร์เฟซที่ใช้งาน จากนั้นจะส่งอ็อบเจ็กต์ซีเรียลไลซ์ไปยังบริการสืบค้น
3. ลูกค้าอินเทอร์เน็ตต้องการบางสิ่งเพื่อใช้งาน ScientificCalculator แต่ไม่รู้ว่าจะหาได้จากที่ไหน จึงสอบถามบริการสืบค้น
4. บริการสืบค้นตอบสนองต่อผลลัพธ์การสืบค้น
การทำงานของเครือข่ายการรักษาตนเอง
1. บริการ Jini บางอย่างต้องมีการลงทะเบียน และบริการสืบค้นจะให้สัญญาเช่า บริการที่ลงทะเบียนใหม่จะต้องต่ออายุสัญญาเช่าเป็นประจำ มิฉะนั้น บริการสืบค้นจะถือว่าบริการออฟไลน์อยู่ สถานะเครือข่ายบริการที่มีอยู่เสร็จสมบูรณ์
2. บริการออฟไลน์เนื่องจากการปิดระบบ ดังนั้นการเช่าจึงไม่ได้รับการอัปเดตและบริการสืบค้นจึงเริ่มต้นขึ้น