Trong Java RMI (Remote Method Invocation), stub đóng một vai trò quan trọng trong quá trình gọi phương thức từ xa. Dưới đây là các chi tiết về vai trò và chức năng của stub trong RMI:
Stub là một đối tượng đại diện cho một đối tượng từ xa trên một máy khác. Nó hoạt động như một cầu nối giữa ứng dụng gọi và đối tượng từ xa, cho phép thực hiện các phương thức của đối tượng đó mà không cần biết đến chi tiết cách thức triển khai hoặc vị trí của nó.
Khi một phương thức được gọi trên stub, nó sẽ chuyển đổi cuộc gọi đó thành một yêu cầu từ xa. Điều này bao gồm việc lấy các tham số cần thiết và xây dựng một yêu cầu mà có thể được gửi qua mạng đến máy chủ.
Stub chịu trách nhiệm thiết lập và duy trì kết nối mạng với máy chủ. Nó sử dụng RMI Registry để tìm kiếm địa chỉ của đối tượng từ xa, đảm bảo rằng các cuộc gọi phương thức được chuyển tiếp đúng đến đối tượng cần thiết.
Khi phương thức được gọi qua stub, các tham số và kết quả của phương thức sẽ được serialize (chuyển đổi thành dạng nhị phân để gửi qua mạng) và deserialize (chuyển đổi trở lại thành đối tượng Java) trên phía máy chủ. Stub thực hiện quá trình này một cách tự động, giúp đơn giản hóa việc trao đổi dữ liệu giữa các máy.
Sau khi máy chủ xử lý yêu cầu, stub sẽ nhận kết quả (hoặc ngoại lệ nếu có) từ máy chủ và chuyển nó trở lại cho ứng dụng gọi. Điều này giúp lập trình viên làm việc với các đối tượng từ xa giống như các đối tượng nội bộ.
Dưới đây là quy trình hoạt động cơ bản của stub trong RMI:
Dưới đây là một ví dụ đơn giản về cách sử dụng stub trong RMI:
import java.rmi.Remote; import java.rmi.RemoteException; public interface HelloWorld extends Remote { String sayHello() throws RemoteException; }
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld { protected HelloWorldImpl() throws RemoteException { super(); } @Override public String sayHello() { return "Hello, World!"; } }
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIServer { public static void main(String[] args) { try { HelloWorld hello = new HelloWorldImpl(); Registry registry = LocateRegistry.createRegistry(1099); registry.rebind("HelloWorld", hello); System.out.println("Server is ready."); } catch (Exception e) { e.printStackTrace(); } } }
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class RMIClient { public static void main(String[] args) { try { Registry registry = LocateRegistry.getRegistry("localhost", 1099); HelloWorld hello = (HelloWorld) registry.lookup("HelloWorld"); String message = hello.sayHello(); System.out.println("Message from server: " + message); } catch (Exception e) { e.printStackTrace(); } } }
Stub là một thành phần quan trọng trong kiến trúc RMI, giúp kết nối và thực hiện các cuộc gọi phương thức từ xa giữa client và server. Nó thực hiện nhiều chức năng quan trọng như gọi phương thức từ xa, quản lý kết nối, và xử lý serialization, giúp lập trình viên dễ dàng làm việc với các đối tượng từ xa như các đối tượng nội bộ. Việc hiểu rõ vai trò của stub sẽ giúp bạn phát triển các ứng dụng RMI một cách hiệu quả và an toàn.