Các lớp và giao diện trong ứng dụng RMI

Một phần của tài liệu LẬP TRÌNH BẰNG CÁC PHƯƠNG PHÁP PHÂN TÁN ĐỂ ĐIỀU KHIỂN BÃI ĐỖ XE (Trang 28 - 34)

a) Giao diện Java.rmi.remote:

Trong RMI giao diện remote được dùng để khai báo một tập hợp các phương thức có thể được gọi ra từ các máy ảo Java từ xa. Một giao diện từ xa phải thỏa mãn các yêu cầu sau:

• Một giao diện từ xa ít nhất (hoặc trực tiếp hoặc gián tiếp) phải có phần mở rộng java.rmi.Remote.

• Mỗi khai báo phương thức trong giao diện từ xa phải thỏa mãn các yêu cầu của một khai báo phương thức từ xa như sau :

• Khai báo phương thức từ xa phải kèm theo ngoại lệ java.rmi.RemoteException (hoặc một siêu lớp của nó như là

java.io.IOException hoặc java.lang.Exception) trong mệnh đề throw của nó.

• Trong một khai báo phương thức từ xa đối tượng từ xa được khai báo như là một tham số hoặc một giá trị trả về (hoặc được khai báo trực tiếp trong danh sách tham số hoặc nhúng vào trong phần tham số của một đối tượng cục bộ) phải được khai báo như interface từ xa chứ không bổ sung cho lớp thuộc Interface.

Giao diện java.rmi.Remote là một trình ghi nhận giao diện, ở đây không định nghĩa các phương thức:

public interface Remote {}

Một giao diện từ xa ít nhất phải có phần mở rộng của giao diện java.rmi.Remote (hoặc thuộc một giao diện từ xa khác có phần mở rộng java.rmi.Remote). Tuy nhiên giao diện từ xa có thể không có phần mở rộng không từ xa với các điều kiện sau :

• Tất cả các phương thức của giao diện đó thỏa mãn các yêu cầu khai báo của một phương thức từ xa.

• Nó chứa các phương thức từ xa để gửi và nhận dữ liệu từ Client đến Server và ngược lại.

Những điều này có thể được thể hiện ở đoạn mã sau, gồm hai giao diện:

• Giao diện ParkingServerFace5

import java.rmi.*; import java.net.*;

public interface ParkingServerFace5 extends Remote{ public void xuly(int i) throws RemoteException; public void capnhat()throws RemoteException;

public void registerClient( ParkingClientFace5 c) throws RemoteException;

• Giao diện ParkingClientFace5:

import java.rmi.*; import java.util.*;

public interface ParkingClientFace5 extends Remote { public void capnhat(int s)throws RemoteException; public void refresh(int vitri)throws RemoteException;

public void refreshcapnhat(int coxe,int trong,int vitrivt[])throws RemoteException;

public void refreshnhan(int coxe,int trong)throws RemoteException;

//public int vitri()throws RemoteException; }

b) Lớp RemoteException

Lớp java.rmi.RemoteException là siêu lớp của các ngoại lệ được tung ra bởi thời gian chạy Java trong suốt quá trình gọi ra các phương thức từ xa. Để bảo đảm thiết thực của các ứng dụng sử dụng hệ thống RMI mỗi phương thức được khai báo trong giao diện từ xa phải định rõ java.rmi.RemoteException (hoặc một trong các siêu lớp của nó như là java.io.IOException hoặc java.lang.Exception) trong mệnh đề throw của nó.

Ngoại lệ java.rmi.RemoteException được tung ra khi tiến trình gọi phương thức từ xa bị hỏng vì một lý do nào đó. Các lý do khiến tiến trình gọi bị hỏng gồm có:

• Sự trao đổi thông tin hỏng (không thể gọi đến Sever từ xa hoặc bị từ chối kết nối, tiến trình kết nối với Sever bị gián đoạn v.v.)

• Hỏng trong thời gian sắp xếp hoặc hủy sắp xếp tham số hoặc giá trị trả về.

Lớp RemoteException là trình kiểm tra ngoại lệ (tiến trình kiểm tra phải được xử lý ở nơi gọi của phương thức từ xa và được kiểm tra bởi trình biên dịch).

Bố cục của lớp này được thể hiện trong đoạn mã sau:

package java.rmi;

public class RemoteException extends java.io.IOException {

public Throwable detail; public RemoteException();

public RemoteException(String s);

public RemoteException(String s, Throwable ex);

public String getMessage(); public void printStackTrace();

public void printStackTrace(java.io.PrintStream ps); public void printStackTrace(java.io.PrintWriter pw); }

c) Lớp Naming

Lớp java.rmi.Naming cung cấp các phương thức lưu trữ và đoạt lấy các tham chiếu đến các đối tượng từ xa trong trình đăng ký đối tượng từ xa. Các phương thức của lớp Naming sử dụng một trong các đối số của chúng ở dạng tên của một URL thuộc Java.lang.String có khuôn dạng sau:

//host:port/name

host là nơi trạm (cục bộ hoặc từ xa) đây là nơi trình đăng ký đã định vị, port là số cổng mà trên đó trình đăng ký chấp nhận cuộc gọi và name là xâu chuỗi, cả host và port là tùy chọn. Nếu bỏ qua host thì trạm mặc định là trạm cục bộ. Nếu bỏ qua port thì cổng mặc định là 1099, đây là cổng của trình đăng ký

Binding cho phép đối tượng từ xa liên kết hoặc đăng ký tên cho đối tượng từ xa có thể được sử dụng sau thời gian tìm kiếm đối tượng từ xa đó. Đối tượng từ xa có thể được liên kết với một tên gọi sử dụng Naming, các phương thức để liên kết hoặc gỡ bỏ liên kết của lớp.

Một khi đối tượng từ xa được đăng ký (bound) với RMI registry trên trạm cục bộ, các trình gọi trên trạm từ xa (hoặc cục bộ ) có thể tìm kiếm đối tượng từ xa theo tên gọi của chúng để đạt được các tham chiếu và sau đó gọi ra các phương thức từ xa trên đối tượng. Trình đăng ký có thể được chia sẻ cho tất cả các Sever đang chạy trên một trạm hoặc một Sever riêng lẻ tiến trình có thể tạo và sử dụng trình đăng ký riêng của nó nếu được yêu cầu.

Đoạn mã được cài đặt như sau :

package java.rmi;

public final class Naming {

public static Remote lookup(String url)

throwsNotBoundException, java.net.MalformedURLException, RemoteException;

public static void bind(String url, Remote obj) throws AlreadyBoundException,

java.net.MalformedURLException, RemoteException; public static void rebind(String url, Remote obj)

throws RemoteException, java.net.MalformedURLException; public static void unbind(String url)

throws RemoteException, NotBoundException, java.net.MalformedURLException; public static String[] list(String url)

throws RemoteException, java.net.MalformedURLException; }

Phương thức lookup trả về đối tượng từ xa được liên kết với file chia sẻ với tên đó. Notboundexception được tung ra nếu tên nếu tên đối tượng không thuộc đối tượng.

Phương thức bind ràng buộc với tên đã định đến đối tượng từ xa. Nó sẽ tung ra ngoại lệ alreadyboundexception nếu tên đó đã ràng buộc một đối tượng.

Phương thức rebind luôn luôn ràng buộc tên đối tượng còn nếu tên đó đã có đăng ký thì sự ràng buộc cũ bị mất tác dụng.

Phương thức unbind hủy đi sự ràng buộc giữa tên và đối tượng từ xa. Nó sẽ tung ra ngoại lệ notboundexception nếu không có sự ràng buộc nào.

Phương thức list trả về một mảng của các đối tượng String chứa đựng một kết nối URL đăng ký trong trình đăng ký. Chỉ có thông tin host và port của URL cần để liên lạc một trình đăng ký để liệt kê nội dung trong đó nhờ đó vùng "file" của URL được bỏ qua.

Java.rmi.accessexception cũng được phép tung ra như là kết quả của các phương thức này.

Accessexception chỉ ra rằng nơi gọi không được phép thực thi các hoạt động cụ thể nào đó.

d) Lớp RemoteObject và các lớp con của nó (java.rmi.*)

Các chức năng Sever RMI được cung cấp bởi Server.RemoteObject và các lớp con của nó là Server.RemoteServer, Server.UnicastRemoteObject và activation.Activatable.

Lớp java.rmi.Server.RemoteObject cung cấp các thành phần bổ sung cho java.lang.Object các phương thức hashCode, equals, và toString các phương thức này rất nhạy bén trong các đối tượng từ xa.

Các phương thức cần để tạo đối tượng từ xa và xuất chúng đi (chúng được tạo sẵn cho các Client từ xa) được cung cấp bởi các lớp UnicastRemoteObject and Activatable.

Lớp java.rmi.Server.UnicastRemoteObject định nghĩa tính duy nhất của đối đối tượng từ xa, các tham chiếu của chúng chỉ hợp lệ khi tiến trình Sever còn tồn tại.

Lớp java.rmi.activation.Activatable là một lớp ảo nó định nghĩa khả năng hoạt động của đối tượng từ xa, đó là khởi động việc thực thi khi các phương thức từ xa của nó được gọi và tự tắt đi khi cần thiết.

Một phần của tài liệu LẬP TRÌNH BẰNG CÁC PHƯƠNG PHÁP PHÂN TÁN ĐỂ ĐIỀU KHIỂN BÃI ĐỖ XE (Trang 28 - 34)