24/05/2018, 15:59

Tìm hiểu RMIREGISTRY và các cách đăng kí đối tượng

Trước giờ chúng ta vãn sử dụng bộ đăng ký rmiregistry như một dịch vụ tìm kiếm. Các đối tượng chủ muốn trình khách truy tìm được từ xa thì trước hết phải đăng ký với rmiregistry. Bộ đăng ký này là chương trình dịch vụ chạy ở hậu trường ,mở ổ cắm Socket và ...

Trước giờ chúng ta vãn sử dụng bộ đăng ký rmiregistry như một dịch vụ tìm kiếm. Các đối tượng chủ muốn trình khách truy tìm được từ xa thì trước hết phải đăng ký với rmiregistry. Bộ đăng ký này là chương trình dịch vụ chạy ở hậu trường ,mở ổ cắm Socket và lắng nghe các yêu cầu gửi đến cổng mặc định 1099.bạn có thể chỉ định một số cổng khác cổng mặc định

Ví dụ c:j2sdk1.4in>Rmiregistry.exe2003

sẽ chạy dịch vụ đăng ký rmiregistry trên cổng 2003.Đối tượng trên máy chủ có thể đăng ký đến dịch vụ này bằng cách gọi Naming.bind() theo cách :

MmyObject o=new MyObjectImpl();

Naming.bind(“rmi://localhost:2003/myobjectname”,o);

Tiếp đến chương trình trên máy khách sẽ yêu cầu dịch vụ đăng ký trả về tham chiếu đến đối tượng trên máy chủ :

MyObject o=(M yObject) Naming.lookup(“rmi://localhost:2003/myobjectname”);

Cơ chế đăng ký nhiều đối tượng với rmiregistry

Java cho phép cơ chế liên lạc với bộ đăng ký rmiregistry để lấy về danh sách các đối tượng hiện rmiregistry đang nắm giữ để bạn tùy nghi sử dụng. Điều này tương tự một cửa hàng có khả năng cung cấp cho bạn nhiều dịch vụ. Muốn biết mình cần thứ gi bạn chỉ ciệc yêu cầu cửa hàng cung cấp danh sách dịch vụ hiện có. Chọn ra một dịch vụ sau đó yêu cầu dịch vụ đó thực hiện chức năng của mình.

Dưới đây là chương trình tìm hiểu danh sách các đối tượng do rmiregistry nắm giữ .Bạn xây dựng chương trình qua các bước sau:

Bước 1:Xây dựng chương trình duyệt rmiregistry.

ví dụ: Traverse.java

import java.rmi.registry.*;

Pubic calss Traverse{

Public static void main (String[] args) throws Exception{

String hostAddr=”127.0.0.1”;

System.out.println(“connecting registry…”);

Registry registruy=LocateRegistry.getregistry(hostAddr);

String objectAvailable[]=registry.list();

System.out.println(“Registry object:”);

For(int i=0;i<objectAvailable.lengh;i++){

System.out.println(“objectAvailable[i]”);

}

}

}

Biên dịch chương trình :

Javac Traverse.java

Bước 2:khởi đọng và đăng ký một số đối tượng rmiregistry.

Khởi động bộ đăng ký :

Start rmiregistry

Đăng ký đối tượng Calculator với bọ đăng ký:

C: miCalculator>java Setup

Đăng ký đối tượng Hello với bộ đăng ký :

C: miByValue>java Setup

Bước 3:Chạy chương trình Traverse:

c: miTraverse>java Traverse

myCalculator

myhello

pingobject

Bạn sẽ liệt kê được tổng cộng 3 đối tượng đã đăng ký với rmiregistry.Chương trình của táử dụng lớp LocateRegistry. Chứa trong gói java.rmi.registry. Bạn cung cấp địa chỉ Ipcủa máy ảo nơi rmiregistry đang chạy, phương thức tĩnh GetRegistry() cua rlớp này sẽ trả về đối tượng registry.

Registry registry=LocateRegistry.getRegistry(hostAddr);

Java cho phép bạn tự tạo bộ đăng cho riêng mình mà không cần dùng đến chương trình rmiregistry.exe. Để tạo bộ đăng ký và tự đăng ký đối tượng bạn gọi phương thức tĩnh createRegistry() của lớp LocateRegistry. Chẳng hạn chương trình setup.java ở ví dụ trên có thể tự đăng ký đố tượng hello theo cách sau:

Ví dụ: Setup.java

Import java.rmi.*;

Import java.rmi.server.*;

Import java.rmi.registry.*;

Public class setup{

Public static void main(String[]args) throws Exception{

LocateRegistry.createRegistry(1099);

helloImpl hello=new HelloImpl();

UnicastRemoteObject.exportObject(hello);

System.out.println(“Registering object…”);

Naming.bind(“rmi:/localhost/myhello”,hello);

System.out.println(“Waiting for client request…”);

}

}

Bạn chỉ cần biên dịch và gọi chương trình java setup của ví dụn trên từ máy chủ. Setup sẽ tự động tạo bộ đăng ký rmiregistry ở cổng mặc định 1099 sau đó tự đăng ký đối tượng với rmiregistry do mình tạo ra. Tuy nhiên cách này chỉ có thể áp dụng một đối tượng. Nếu một đối tượng nào đó đã tạo ra bộ đăng ký rồi thì bạn không được goi LocateRegistry.createRegistry() lần thứ hai trên cùng một cổng của máy chủ. Bạn phảI tạo một cổng khác cho bộ đăng ký

0