Chuyển ñối tượng theo tham chiếu
Nếu ñối tượng quá lớn chuyển ñối tượng qua mạng sẽ ảnh hưởng ñến tốc ñộ của chương trình. Ta có thể
cho trình khách ñược gọi từ xa bởi trình chủ.
Như vậy ñối tượng trên trình khách phải cài ñặt giao tiếp
Remote, sinh lớp trung gian Stub, Skel, ñăng ký rmiregistry ñể trình chủ có thể tham chiếu ñến.
Cơ chế gọi ngược từ xa của trình chủ ñến trình khách thông qua tham chiếu còn ñược gọi là cơ chế Callback. Kỹ thuật gọi ngược thường rất hữu hiệu cho trình khách
Ví dụ
Ví dụ
Xây dựng chương trình theo kỹ thuật Callback triệu gọi lẫn nhau giữa ñối tượng trên trình khách và ñối tượng trên trình chủ thông qua cơ chế tham chiếu.
Tạo một ñối tượng AtClient chạy trên máy khách. Tạo một ñối tượng AtServer chạy trình máy chủ.
Ví dụ
Ví dụ -- BBướước 1c 1
ðặt tả giao tiếp interface cho ñối tượng AtClient /*AtClient.java*/
import java.rmi.*;
public interface AtClient extends Remote {
public void callClientMethod(String message)
throws RemoteException; }
Ví dụ
Ví dụ -- BBướước 2c 2
ðặt tả giao tiếp interface cho ñối tượng AtServer /*AtServer.java*/
import java.rmi.*;
public interface AtServer extends Remote {
public void registerClient(AtClient c)
throws RemoteException;
public void callServerMethod(String message)
throws RemoteException; }
Ví dụ
Ví dụ -- BBướước 3c 3
Cài ñặt chi tiết cho ñối tượng AtClient thông qua lớp AtClientImpl
/*AtClientImpl.java*/
import java.rmi.*;
public class AtClientImpl implements AtClient{
public void callClientMethod(String message)
throws RemoteException {
System.out.println(message); }
Ví dụ
Ví dụ -- BBướước 4c 4
Cài ñặt chi tiết cho ñối tượng AtServer
import java.rmi.*;
public class AtServerImpl implements AtServer{ AtClient client;
public void registerClient(AtClient c) throws RemoteException{ client=c;
}
public void callServerMethod(String message) throws RemoteException{
System.out.println(message);
for (int i=1; i<10; i++){
String msg= "Server response "+ Math.random()*1000; client.callClientMethod(msg);
}} }
}
Ví dụ
Ví dụ -- BBướước 5c 5
/*Setup.java*/
import java.rmi.*;
import java.rmi.server.*;
public class Setup{
public static void main(String args[]) throws Exception {
AtServer server = new AtServerImpl();
//Thông báo khả năng giao tiếp ñược từ xa của ñ/t với máy ảo java
UnicastRemoteObject.exportObject(server);
//ðăng ký ñối tượng với rmiregistry
Naming.bind("rmi://localhost/serverobject", server); System.out.println("Waiting for client request ...");
Ví dụ
Ví dụ -- BBướước 6c 6
Chương trình Client gọi phương thức của ñ/t AtServer
import java.rmi.*;
import java.rmi.server.*;
public class Client {
public static void main(String args[]) throws Exception{ AtClient client = new AtClientImpl();
UnicastRemoteObject.exportObject(client); AtServer server =
(AtServer)Naming.lookup("rmi://localhost/serverobject"); server.registerClient(client);
server.callServerMethod("Client Contact Server"); }
}
Ví dụ
Ví dụ -- BBướước 7c 7
Biên dịch và chạy chương trình C:\RMI\ByRef>javac *.java
Sinh lớp trung gian Stub, Skel cho AtServer và AtClient C:\RMI\ByRef>rmic AtServerImpl
C:\RMI\ByRef>rmic AtClientImpl
Khởi ñộng rmiregistry
C:\RMI\ByRef>start rmiregistry
Cài ñặt ñối tượng trên máy chủ
C:\RMI\ByRef>start java Setup