- Hãy chắc chắn để sử dụng URL khi bắt đầu các máy chủ Di chuyển các lớp trong thư mục server vào máy chủ của bạn và bắt đầu đăng ký RMI và máy
2/ Passing Remote Objects (Truyền đối tượng từ xa):
- Truyền các đối tượng từ xa từ máy chủ đến máy con thì đơn giản. Máy con nhận được một đối tượng stub, sau đó lưu nó vào một biến đối tượng với cùng loại như giao diện từ xa.Máy con có thể truy cập liền các đối tượng hiện tại trên máy chủ thông qua biến.Máy con có thể sao chép biến này vào máy cục bộ riêng của nó ,những bản sao chép đó được tham chiếu đơn đến cùng stub. Điều quan trọng cần lưu ý rằng chỉ có các giao diện từ xa mới có thể được truy cập thông qua stub. Một giao thức từ xa là bất kì giao thức thực hiện mở rộng Remote. Tất cả các phương thức cục bộ là không thể truy cập thông qua stub.(Một phương thức cục bộ là bất kỳ phương thức mà không được xác định trong một giao diện từ xa).Các phương thức cục bộ có thể chỉ chạy trên các máy ảo có chứa các đối tượng hiện tại.
- Tiếp theo, các stub chỉ được tạo ra từ các lớp mà thực hiện một giao diện từ xa,và chỉ các phương thức được quy định các giao diện là được cung cấp trong các lớp stub. Nếu một lớp con không thực hiện một giao diện từ xa nhưng một lớp cha thực hiện điều đó, và một đối tượng của lớp con (subclass) được truyền cho một phương thức từ xa, chỉ có các phương thức lớp cha (superclass) có thể truy cập. Để hiểu điều này tốt hơn, xem xét ví dụ sau đây. Chúng ta nhận được một lớp
41 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán trong Java
class BookImpl extends ProductImpl {
public BookImpl(String title, String theISBN, int sex, int age1, int age2, String hobby)
{
super(title + " Book", sex, age1, age2, hobby); ISBN = theISBN;
}
public String getStockCode() { return ISBN; } private String ISBN;
}
- Bây giờ, giả sử chúng ta truyền một đối tượng sách đến một phương thức từ xa,cũng như truyền một tham số hoặc là một giá trị trả về. Người nhận có được một đối tượng stub, nhưng stub đó không phải là một stub sách. Thay vào đó, nó là một stub cho lớp cha ProductImpl bởi vì chỉ có lớp mà thực hiện một giao diện từ xa (xem Hình 5-9). Như vậy, trong trường hợp này, phương thức getStockCode không có sẵn từ xa.
42 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán trong Java
-Một lớp từ xa có thể thực hiện đa giao diện.Ví dụ, lớp BookImpl có thể thực hiện giao diện thứ hai trong việc thêm vào Product. Ở đây, chúng ta định nghĩa một giao diện từ xa StockUnit và có lớp BookImpl thực hiện nó.
interface StockUnit extends Remote {
public String getStockCode() throws RemoteException; }
class BookImpl extends ProductImpl implements StockUnit {
public BookImpl(String title, String theISBN, int sex, int age1, int age2, String hobby)
throws RemoteException {
super(title + " Book", sex, age1, age2, hobby); ISBN = theISBN;
}
public String getStockCode() throws RemoteException {
return ISBN; }
private String ISBN; }
Hình 5-10 cho thấy sơ đồ thừa kế.
43 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán trong Java
- Bây giờ, khi một đối tượng sách được truyền đến một phương thức từ xa, người nhận có được một stub mà đã truy cập tới các phương thức từ xa trong cả lớp Product và StockUnit. Trong thực tế, ta có thể sử dụng toán tử instanceof để tìm kết quả ra mà có một đối tượng từ xa cụ thể thực hiện một giao diện hay không. Dưới đây là một tình huống điển hình mà trong đó ta sẽ sử dụng tính năng này. Giả sử bạn nhận được một đối tượng từ xa thông qua một biến kiểu Product. ArrayList<Product> result = centralWarehouse.find(c);
for (Product p : result) {
. . . } }
- Đối tượng từ xa có lẽ là sách hoặc không phải. Chúng ta muốn sử dụng instanceof để tìm kết quả ra dù nó có hay không, nhưng chúng ta không thể kiểm tra
if (p instanceof BookImpl) // wrong {
BookImpl b = (BookImpl) p; . . .
}
- Đối tượng p ám chỉ một đối tượng stub, và BookImpl là lớp của đối tượng máy chủ. Thay vào đó, tìm đến giao thức thứ hai:
44 Lập Trình Hệ Thống Với Java – Tìm hiểu lập trình phân tán trong Java { { StockUnit s = (StockUnit) p; String c = s.getStockCode(); . . . }
- Đoạn mã này kiểm tra xem có đối tượng stub mà p ám chỉ thực hiện giao thức StockUnit hay không.Nếu vậy, nó gọi phương thức từ xa getStockCode của giao diện đó.
Tóm tắt:
Nếu một đối tượng thuộc về một lớp mà thực hiện một giao diện từ xa sẽ được truyền tới một phương thức từ xa, phương thức từ xa nhận được một đối tượng stub.
Bạn có thể bỏ đối tượng stub đó để bất kỳ giao diện từ xa mà lớp thực hiện triển khai thực hiện.
Bạn có thể gọi tất cả các phương thức từ xa được xác định tại các giao diện đó, nhưng bạn không thể gọi bất kỳ phương thức cục bộ thông qua stub.
3/. Remote Objects and the equals and hashCode Methods(Các đối tượng từ xa và các phương thức so sánh bằng và mã băm): tượng từ xa và các phương thức so sánh bằng và mã băm):
- Trong trường hợp một tập băm hoặc bản đồ băm, phương thức hashCode phải được xác định.Tuy nhiên, có một vấn đề khi cố gắng để so sánh các đối tượng từ xa.Tìm kết quả ra nếu hai đối tượng từ xa có cùng một nội dung, gọi đến
equals và equals cần liên lạc với máy chủ đang chứa các đối tượng và so sánh các nội dung đó.Nhưng việc gọi đó có thể thất bại. Tuy nhiên, phương thức
equals trong lớp Object không được mô tả để ném một RemoteException, trong khi tất cả các phương thức trong một giao diện từ xa phải ném ngoại lệ. Bởi vì một phương thức lớp con không thể ném nhiều ngoại lệ hơn so với phương pháp lớp cha mà nó thay thế, ta không thể xác định một phương thức equals trong một giao diện từ xa.Tương tự cho hashCode.
- Đáng lẽ, các phương thức equals và hashCode trên các đối tượng stub chỉ cần nhìn vào vị trí của các đối tượng máy chủ. Phương thức equals cho rằng hai stub bằng nhau nếu chúng chuyển đến đối tượng cùng máy chủ. Hai stub đề cập