JavaRush /Blog Java /Random-VI /RMI: thực hành sử dụng

RMI: thực hành sử dụng

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ xem xét một chủ đề khá thú vị - RMI . Đây là viết tắt của Gọi phương thức từ xa . RMI: thực hành sử dụng - 1Với RMI, bạn có thể dạy hai chương trình giao tiếp với nhau, ngay cả khi chúng ở trên các máy tính khác nhau. Nghe hay đấy? :) Nhưng nó không quá khó để làm được! Trong bài giảng hôm nay chúng ta sẽ hiểu tương tác RMI bao gồm những phần nào và cách cấu hình nó. Điều đầu tiên chúng ta cần là clientserver . Bạn không cần phải đi sâu vào thuật ngữ máy tính. Trong trường hợp của RMI, đây chỉ đơn giản là hai chương trình. Một trong số chúng sẽ chứa một số đối tượng và đối tượng thứ hai sẽ gọi các phương thức của đối tượng này. Gọi các phương thức của một đối tượng trong một chương trình nằm trong một chương trình khác - chúng tôi chưa bao giờ thực hiện việc này trước đây! Đã đến lúc thử nó! :) Để không bị chết đuối trong nơi hoang dã, hãy để chương trình của chúng tôi đơn giản. Nói chung, máy chủ thường thực hiện một số loại tính toán mà máy khách yêu cầu. Nó sẽ giống nhau đối với chúng tôi. Chúng ta sẽ có một chương trình máy tính đơn giản làm máy chủ. Cô ấy sẽ chỉ có một phương pháp - multiply(). Nó sẽ nhân hai số mà chương trình máy khách gửi đến nó và trả về kết quả. Trước hết chúng ta cần một giao diện:
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculator extends Remote {

   int multiply(int x, int y) throws RemoteException;
}
Tại sao chúng ta cần một giao diện? Thực tế là công việc của RMI dựa trên việc tạo proxy mà bạn đã học ở một trong những bài giảng trước . Và làm việc với proxy, như bạn có thể nhớ, được thực hiện chính xác ở cấp độ giao diện chứ không phải cấp độ lớp. Có 2 yêu cầu quan trọng đối với giao diện của chúng tôi!
  1. Nó phải kế thừa giao diện Remote token.
  2. Tất cả các phương thức của nó phải đưa ra RemoteException (việc này không được thực hiện tự động trong IDE, bạn phải viết thủ công!).
Bây giờ chúng ta cần tạo một lớp máy chủ sẽ triển khai giao diện của chúng ta Calculator. RMI: thực hành sử dụng - 2Mọi thứ ở đây cũng khá đơn giản:
import java.rmi.RemoteException;

public class RemoteCalculationServer implements Calculator {

   @Override
   public int multiply(int x, int y) throws RemoteException {
       return x*y;
   }

}
Thậm chí không có nhiều điều để bình luận ở đây :) Bây giờ chúng ta cần viết một chương trình máy chủ sẽ cấu hình và khởi chạy lớp máy tính máy chủ của chúng ta. Nó sẽ trông giống thế này:
import java.rmi.AlreadyBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class ServerMain {

   public static final String UNIQUE_BINDING_NAME = "server.calculator";

   public static void main(String[] args) throws RemoteException, AlreadyBoundException, InterruptedException {

       final RemoteCalculationServer server = new RemoteCalculationServer();

       final Registry registry = LocateRegistry.createRegistry(2732);

       Remote stub = UnicastRemoteObject.exportObject(server, 0);
       registry.bind(UNIQUE_BINDING_NAME, stub);

       Thread.sleep(Integer.MAX_VALUE);

   }
}
Hãy cùng tìm hiểu nhé :) Trong dòng đầu tiên, chúng ta tạo một số loại biến chuỗi:
public static final String UNIQUE_BINDING_NAME = "server.calculator";
Chuỗi này là tên duy nhất của đối tượng từ xa . Bằng tên này, chương trình khách sẽ có thể tìm thấy máy chủ của chúng tôi: bạn sẽ thấy điều này sau. Tiếp theo chúng ta tạo đối tượng máy tính:
final RemoteCalculationServer server = new RemoteCalculationServer();
Mọi thứ đều rõ ràng ở đây. Điều sau đây thú vị hơn:
final Registry registry = LocateRegistry.createRegistry(2732);
Thứ này được gọi là Sổ đăng ký là sổ đăng ký các đối tượng đã bị xóa . “Đã xóa” không phải có nghĩa là chúng tôi đã xóa chúng khỏi máy tính mà thực tế là các đối tượng từ thanh ghi này có thể được truy cập từ xa từ các chương trình khác :) LocateRegistry.createRegistry()Chúng tôi đã chuyển số 2732 cho phương thức. Đây là số cổng. Nếu bạn không biết cổng là gì, bạn có thể đọc nó ở đây , nhưng bây giờ bạn chỉ cần nhớ rằng đây là số duy nhất mà các chương trình khác có thể tìm thấy sổ đăng ký đối tượng của chúng tôi (bạn cũng sẽ thấy điều này bên dưới). Tiếp tục nào. Hãy xem điều gì xảy ra ở dòng tiếp theo:
Remote stub = UnicastRemoteObject.exportObject(server, 0);
Trên dòng này chúng ta tạo một sơ khai . Một sơ khai gói gọn toàn bộ quá trình gọi từ xa trong chính nó. Có thể nói đây là yếu tố quan trọng nhất của RMI. Cô ấy đang làm gì?
  1. Nhận tất cả thông tin về cuộc gọi từ xa đến một phương thức.
  2. Nếu phương thức có tham số, sơ khai sẽ giải tuần tự hóa chúng. Hãy chú ý đến điểm này! Các tham số mà bạn chuyển đến các phương thức cho cuộc gọi từ xa phải có khả năng tuần tự hóa (sau cùng, chúng sẽ được truyền qua mạng). Chúng tôi không gặp phải vấn đề như vậy - chúng tôi chỉ truyền số. Nhưng nếu bạn chuyển đồ vật, đừng quên nó!
  3. Sau đó, nó gọi phương thức mong muốn.
Chúng tôi chuyển UnicastRemoteObject.exportObject()đối tượng máy tính máy chủ của mình cho phương thức. Bằng cách này, chúng tôi có thể gọi các phương thức của nó từ xa. Chúng ta chỉ còn một việc phải làm:
registry.bind(UNIQUE_BINDING_NAME, stub);
Chúng tôi “đăng ký” sơ khai của mình trong sổ đăng ký đối tượng từ xa dưới cái tên mà chúng tôi đã nghĩ ra ngay từ đầu. Bây giờ khách hàng có thể tìm thấy nó! Bạn có thể nhận thấy rằng cuối cùng chúng ta đặt luồng chính của chương trình ở chế độ ngủ:
Thread.sleep(Integer.MAX_VALUE);
Chúng ta chỉ cần giữ cho máy chủ hoạt động trong thời gian dài. Chúng ta sẽ chạy hai phương thức trong IDEa cùng một lúc main(): đầu tiên là phương thức máy chủ (trong lớp ServerMainchúng ta đã viết) và sau đó là phương thức máy khách (trong lớp ClientMainchúng ta sẽ viết bên dưới). Điều quan trọng là chương trình máy chủ không ngừng hoạt động khi chúng tôi khởi chạy ứng dụng khách, vì vậy chúng tôi chỉ cần đặt nó ở chế độ ngủ trong một thời gian dài. Nó vẫn hoạt động :) Bây giờ chúng ta có thể chạy main()phương thức máy chủ của mình. Hãy để nó chạy và đợi chương trình máy khách gọi một phương thức nào đó :) Bây giờ hãy viết một chương trình máy khách! Nó sẽ gửi số đến máy chủ của chúng tôi để nhân lên.
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class ClientMain {

   public static final String UNIQUE_BINDING_NAME = "server.calculator";

   public static void main(String[] args) throws RemoteException, NotBoundException {

       final Registry registry = LocateRegistry.getRegistry(2732);

       Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);

       int multiplyResult = calculator.multiply(20, 30);

       System.out.println(multiplyResult);
   }
}
Cô ấy trông không phức tạp. Những gì đang xảy ra ở đây? Đầu tiên, máy khách phải biết tên duy nhất của đối tượng có phương thức mà nó sẽ gọi từ xa. Do đó, trong chương trình máy khách, chúng ta cũng tạo một biến. public static final String UNIQUE_BINDING_NAME = "server.calculator"; Tiếp theo, trong phương thức này, main()chúng ta có quyền truy cập vào thanh ghi của các đối tượng từ xa. Để thực hiện việc này, chúng ta cần gọi phương thức LocateRegistry.getRegistry()và chuyển vào đó số cổng mà thanh ghi của chúng ta đã được tạo trong chương trình ServerMain - cổng 2732 (số này đã được chọn làm ví dụ, bạn có thể thử sử dụng số khác):
final Registry registry = LocateRegistry.getRegistry(2732);
Bây giờ tất cả những gì chúng ta phải làm là lấy đối tượng mong muốn từ sổ đăng ký! Thật dễ dàng vì chúng tôi biết tên độc đáo của anh ấy!
Calculator calculator = (Calculator) registry.lookup(UNIQUE_BINDING_NAME);
Hãy chú ý đến việc đúc kiểu. Chúng tôi chuyển đối tượng kết quả sang một giao diện Calculatorthay vì một lớp cụ thể RemoteCalculationServer . Như chúng tôi đã nói ở đầu bài giảng, RMI dựa trên việc sử dụng proxy, do đó, cuộc gọi từ xa chỉ khả dụng đối với các phương thức giao diện chứ không phải các lớp. Cuối cùng, chúng tôi gọi từ xa một phương thức multiply()trên đối tượng của mình và in kết quả ra bảng điều khiển.
int multiplyResult = calculator.multiply(20, 30);
System.out.println(multiplyResult);
Chúng ta đã khởi chạy phương thức này main()trong lớp ServerMaintừ lâu rồi, đã đến lúc khởi chạy phương thức này main()trong chương trình máy khách ClientMain! Đầu ra của bảng điều khiển: 600 Thế là xong! Chương trình của chúng tôi (thậm chí là hai!) đã hoàn thành xuất sắc chức năng của nó :) Nếu có thời gian và mong muốn, bạn có thể đa dạng hóa nó một chút. Ví dụ: đảm bảo rằng máy tính hỗ trợ tất cả bốn thao tác tiêu chuẩn chứ không phải số mà một đối tượng được truyền dưới dạng tham số CalculationInstance(int x, int y). Là tài liệu bổ sung, bạn có thể xem các bài viết và ví dụ - tại đây: Hẹn gặp lại các bạn trong những buổi học tiếp theo! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION