TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM
LẬP TRÌNH ỨNG DỤNG MẠNG BÀI 3
RMI (Remote Method Invoke)
GIẢNG VIÊN: VÕ TẤN DŨNG
PHẦN 1 GIỚI THIỆU TỔNG QUAN VỀ RMI
g n ũ D n ấ T õ V
:
V G
TỔNG QUAN VỀ RMI
• Thông thường các chương trình của chúng ta được viết dưới dạng thủ tục hay hàm. Mã lệnh của hàm (hay thủ tục) được nạp thẳng vào bộ nhớ và thực thi ngay trên máy cục bộ. Vậy thì có cách nào nạp nội dung của hàm hay đối tượng ở một máy nào đó và gọi chúng từ một máy khác hay không?
3
g n ũ D n ấ T õ V
:
V G
• RMI (Remote Method Invoke – có nghĩa là gọi phương thức từ xa) là cách thức giao tiếp giữa các đối tượng Java có mã lệnh cài đặt nằm trên máy khác nhau có thể gọi lẫn nhau.
Local Machine (Client)
Remote Machine (Server)
SampleServer remoteObject; int s; …
s=remoteObject.sum(1,2);
1,2
public int sum(int a,int b) {
return a + b;
}
3
System.out.println(s);
4
g n ũ D n ấ T õ V
:
V G
STUB và SKELETON
• Các tham số truyền cho các phương thức của đối tượng ở xa phải được đóng gói và chuyển qua mạng để đến được với phương thức thực sự (việc truyền kết quả trở về cũng vậy).
• Để giải quyết các vấn đề trên, đối tượng Java trên hai máy khác nhau không gọi nhau trực tiếp mà thông qua các lớp trung gian nằm trên cả máy khách và máy chủ.
• Phía máy khách, lớp trung gian này được gọi là Stub.
5
g n ũ D n ấ T õ V
:
V G
Phía máy chủ, lớp trung gian này được gọi là Skeleton.
Computer A
Computer C
l
A1
b u t s _ 1 C
e k s _ 1 C
A2
C1
B1_stub
B1_skel
Computer B
6
g n ũ D n ấ T õ V
:
V G
B1
CƠ CHẾ HOẠT ĐỘNG CỦA RMI
Remote Machine
bind
• Đầu tiên RMI-server đăng
RMI Server
ký tên của nó với bộ Registry.
Registry
skeleton
lookup
return
call
• RMI-client tìm tên của RMI-server trong bộ Registry để thiết lập truy cập từ xa với RMI-server.
stub
• Stub đóng gói tham số rồi
RMI Client
Local Machine
7
g n ũ D n ấ T õ V
:
V G
gửi đến Skeleton. Skeleton gọi phương thức từ xa rồi đóng gói kết quả gửi về Stub.
GIAO TIẾP STUB-SKELETON
call
RMI Client
RMI Server
b u t S
s k e l e t o n
return
• Client gọi một phương thức từ xa, lời gọi này đầu
tiên được chuyển tiếp đến Stub.
• Stub có nhiệm vụ gửi tiếp lời yêu cầu này đến Skeleton phía server bằng cách Stub mở một socket đến server, đóng gói các tham số rồi truyền luồng dữ liệu này đến Skeleton.
• Skeleton chứa đựng một phương thức nhận các lời yêu cầu từ xa, mở gói tham số, gọi hàm thực sự trên server để tính toán rồi trả kết quả về Stub phía client.
8
g n ũ D n ấ T õ V
:
V G
PHẦN 2 THIẾT KẾ ỨNG DỤNG PHÂN TÁN RMI
g n ũ D n ấ T õ V
:
V G
CÁC BƯỚC XÂY DỰNG MỘT RMI
1. Định nghĩa một giao tiếp từ xa (remote interface) trên
server.
2. Xây dựng một đối tượng từ xa (remote object) bằng cách
hiện thực giao tiếp từ xa (remote interface).
10
g n ũ D n ấ T õ V
:
V G
3. Xây dựng chương trình phía client. 4. Biên dịch các file Java nguồn (phía client và server). 5. Sinh ra các Stub phía client và Skeleton phía server. 6. Khởi động bộ đăng ký RMI (RMI registry) 7. Khởi động các đối tượng từ xa phía server 8. Chạy chương trình phía client.
Step 1: ĐỊNH NGHĨA MỘT REMOTE INTERFACE
Để tạo một ứng dụng RMI, bước đầu tiên là định nghĩa một Remote Interface giữa các đối tượng Client và Sever. Các phương thức trong Remote Inteface muốn được gọi từ xa đều phải có khả năng ném ra ngoại lệ RemoteException.
/* Calculator.java */ package calculator; import java.rmi.*;
public interface Calculator extends Remote {
public int sum(int x,int y) throws RemoteException;
11
g n ũ D n ấ T õ V
:
V G
}
Step 2: HIỆN THỰC REMOTE INTERFACE
Lớp Calculator ở Step 1 chỉ là một Remote Interface, nó chỉ đặc tả các phương thức của đối tượng. Từ giao tiếp đó, đối tượng thực sự phải được cài đặt như sau:
/* CalculatorImpl.java*/ import java.rmi.*;
public class CalculatorImpl implements Calculator {
public int addNum(int x,int y) throws RemoteException {
System.out.println(“Client request to calculate”); return (x+y);
}
C:\RMI>javac CalculatorImpl.java
12
g n ũ D n ấ T õ V
:
V G
}
Step 2: HIỆN THỰC REMOTE INTERFACE (tt)
Bây giờ ta viết một chương trình để cài đặt đối tượng Calculator trên máy server. Ta đặt tên chương trình này là CalculatorServer:
C:\RMI>javac CalculatorServer.java
/* CalculatorServer.java*/ import java.rmi.server.*; Import java.rmi.*; public class CalculatorServer {
public static void main(String args[]) {
try{
//tạo đối tượng Calculator thực sự CalculatorImpl c=new CalculatorImpl(); System.out.println(“Exporting Calculator…”); //thông báo sự hiện diện của đối tượng cho máy ảo Java UnicastRemoteObject.exportObject(c); //đăng ký đối tượng với bộ quản lý rmi Naming.bind(“rmi://localhost/Mycalculator”,c); System.out.println(“Register Calculator!”);
} catch(Exception e) { System.out.println(e); }
}
13
g n ũ D n ấ T õ V
}
:
V G
Step 3: XÂY DỰNG CHƯƠNG TRÌNH PHÍA CLIENT
Ở bước này ta thiết kế chương trình phía bên máy khách (client) có khả
năng gọi và sử dụng đối tượng Calculator trên máy chủ (server), như sau:
/* CalculatorClient.java*/ Import java.rmi.*; public class CalculatorClient {
public static void main(String args[]) {
try{
//tìm đối tượng cần truy xuất theo tên System.out.println(“Finding object…”); Calculator c=(Calculator)Naming.lookup
(“rmi://localhost/MyCalculator”);
//gọi phương thức của đối tượng System.out.println(c.addNum(12,1));
} catch(Exception e) { System.out.println(e); }
}
}
Chú ý: ở đây c thuộc lớp Calculator nhưng thực tế khi chạy thì chương trình sẽ gọi CalculatorImpl.class
14
g n ũ D n ấ T õ V
:
V G
Step 4: BIÊN DỊCH CÁC FILE JAVA NGUỒN
Phía server ta đã có các fie nguồn là Calculator.java, CalculatorImpl.java, CalculatorServer.java. Tiến hành biên dịch chúng như sau:
C:\RMI>javac Calculator.java C:\RMI>javac CalculatorImpl.java C:\RMI>javac CalculatorServer.java
Phía bên Client ta đã có file nguồn là CalculatorClient.java. Tiến hành biên dịch như sau:
15
g n ũ D n ấ T õ V
:
V G
C:\RMI>javac CalculatorClient.java
Step 5: SINH LỚP TRUNG GIAN STUB & SKETLETON
Dựa vào lớp cài đặt CalculatorImpl.class, trình biên dịch rmic.exe của Java của Java sẽ cung cấp cho ta hai lớp trung gian Stub và Skeleton. Mở của sổ DOS-promp (cmd) rồi đánh lệnh biên dịch sau:
C:\RMI>rmic CalculatorImpl
16
g n ũ D n ấ T õ V
:
V G
Kết quả ta sẽ thu được hai tập tin CalculatorImpl_Stub.class và CalculatorImpl_Skel.class
Step 6: CHẠY CHƯƠNG TRÌNH rmiregistry.exe
Mở cửa sổ DOS-prompt (cmd) chạy chương trình rmiregistry
từ dòng lệnh như sau:
C:\RMI>rmiregistry.exe
Chương trình này có thể không phản hồi cho ta thông tin gì cả bởi vì đây là chương trình chạy ở dạng service. Nó có nhiệm vụ đón nhận các kết nối chứa thông tin về đối tượng do phương là sau khi khởi động thức Naming.bind() gửi đến. Tốt nhất rmiregistry.exe trong cửa sổ DOS-prompt ta hãy thu nhỏ cửa sổ này trên thanh Taskbar của Windows. Khi đã được khởi động thì bộ quản lý rmiregistry này luôn trong trạng thái sẵn sàng phục vụ. Mặc định rmiregistry.exe lắng nghe các kết nối gửi đến cổng 1099. Ta có thể chỉ định số hiệu cổng khác cho rmiregistry. Ví dụ lệnh sau sẽ chạy rmiregistry.exe trên cổng 2003
C:\RMI>rmiregistry.exe 2003
Tùy theo phiên bản Java mà ta cài đặt, ta có thể tìm thấy
rmiregistry.exe trong thư mục như C:\Java\jdk1.6.0_11\bin
17
g n ũ D n ấ T õ V
:
V G
Step 7: KHỞI ĐỘNG CÁC ĐỐI TƯỢNG PHÍA SERVER
Ta đã mở một cửa sổ DOS-prompt chạy rmiregistry.exe. Bây giờ ta mở một cửa sổ DOS-prompt khác chạy chương trình CalculatorServer như sau:
C:\RMI>java CalculatorServer Exporting Calculator… Register Calculator!
18
g n ũ D n ấ T õ V
:
V G
Cũng như rmiregistry.exe, sau khi CalculatorServer được gọi, hàm Naming.bind() sẽ đi vào vòng lặp vô tận để chờ nhận yêu cầu từ client đến. Đến lúc này tađ ã có 2 chương trình chạy ở chế độ hậu trường là rmiregistry.exe và CalculatorServer. Mỗi chương trình chạy trên một cửa sổ độc lập.
Step 8: CHẠY CHƯƠNG TRÌNH PHÍA CLIENT
Bây giờ ta mở thêm một cửa sổ DOS-prompt thứ ba để chạy chương trình CalculatorClient như sau:
C:\RMI>java CalculatorClient Finding Object… 13
thức
addNum()
của
đối
(kết quả trả về tổng của 12+1 chính là lời gọi đến tượng phương CalculatorImpl. Theo dõi cửa sổ DOS-prompt nơi chương trình CalculatorServer đang chạy ta sẽ thấy kết xuất sau: “Client request to calculate”.)
19
g n ũ D n ấ T õ V
:
V G
PHẦN 3 VẤN ĐỀ CHUYỂN THAM SỐ TRONG LỜI GỌI PHƯƠNG THỨC TỪ XA
g n ũ D n ấ T õ V
:
V G
CHUYỂN THAM SỐ TRONG RMI
• Trong Java, đối tượng được truyền theo tham chiếu còn các kiểu dữ liệu đơn giản như int, char,… được truyền theo tham trị.
• Đối với việc truyền tham số qua mạng theo cơ chế RMI thì có
trong hai
hai nguyên tắc sau: - Tất cả các kiểu dữ liệu đơn giản như int, char,… đều được truyền theo tham trị. - Tất cả các dữ liệu kiểu đối tượng muốn truyền qua mạng đều buộc phải cài đặt một tiếp là Remote hoặc Serializable. Các đối tượng cài giao tiếp Remote sẽ được truyền theo tham chiếu còn các đối tượng cài đặt giao tiếp Serializable sẽ được truyền theo tham trị.
21
• Hầu như các kiểu dữ liệu đối tượng cơ bản như String, Date, Time,… trong Java đều cài đặt giao tiếp Serializable cho nên chúng được chuyển cho các lời gọi hàm hay phương thức từ xa theo tham trị.
g n ũ D n ấ T õ V
:
V G
CHUYỂN ĐỐI TƯỢNG ĐẾN TRÌNH CHỦ THEO THAM TRỊ
g n ũ D n ấ T õ V
:
V G
CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ
• Tất cả các lớp đối tượng cài đặt giao tiếp Serializable đều được Java xem như là có khả năng tuần tự hóa. Nghĩa là ta có thể yêu cầu Java lưu toàn bộ đối tượng lên đĩa cứng thành một tập tin nào đó, sau đó đem tập tin này đền máy khác ta có thể khôi phục đối tượng về trạng thái ban đầu mà không cần phải khởi tạo đối tượng mới bằng lệnh new. • Trong thuật ngữ lập trình phân tán, quy trình chuyển tham lớp trung gian Stub và
số và dữ liệu qua lại giữa hai Skeleton được gọi là mashaling và un-mashaling.
23
g n ũ D n ấ T õ V
:
V G
• Trong các lời gọi phương thức RMI, kiểu dữ liệu đối tượng nếu không cài đặt một trong hai giao tiếp Serializable hoặc Remote thì sẽ không thể dùng làm tham số truyền qua mạng được.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ
• Sau đây chúng ta xây dựng một chương trình chuyển tham số đối tượng theo tham trị qua mạng từ máy khách đến máy chủ trong RMI.
24
g n ũ D n ấ T õ V
:
V G
• Chương trình này tựa trò chơi ném bóng, trình khách sẽ ném một một quả banh (đối tượng Ball) lên máy chủ, trình chủ sẽ tiếp nhận quả banh và trả về cho trình khách.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 1)
• Bước 1: Thiết kế lớp Ball.class được dùng làm tham số
/* Ball.java*/ Import java.io.*; public class Ball implements Serializable {
int weight=0; public Ball(int w){
weight=w;
} public int getWeight(){
return weight;
} public void setWeight(int w){
weight=w;
}
}
25
g n ũ D n ấ T õ V
:
V G
chuyền qua mạng giữa trình khách và trình chủ.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 2)
• Bước 2: Đặc tả giao tiếp interface cho đối tượng trên máy
/* PingServer.java*/ import java.rmi.*; public interface PingServer extends Remote{
public Ball ping(Ball b) throws RemoteException;
}
chủ
26
g n ũ D n ấ T õ V
:
V G
• PingServer được đặt trên trình chủ. Đối tượng PingServer của ta có một phương thức ping(). Phương thức này sẽ được gọi bởi trình khách. Trình khách sử dụng phương thức ping() để ném quả bóng lên trình chủ thông qua tham số có kiểu đối tượng là Ball. Phương thức ping() sau khi tiếp nhận sẽ ném trả về đối tượng Ball cho trình khách thông qua trị trả về của trình khách.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 3)
• Bước 3: Cài đặt chi tiết cho đối tượng PingServer thông
/* PingServerImpl.java*/ import java.rmi.*; public class PingServerImpl implements PingServer{ public Ball ping(Ball b) throws RemoteException{
//tiếp nhận đối tượng từ trình khách System.out.println(“Client send a Ball object weight ”+b.getWeight()); //thay đổi nội dung đối tượng //hay nói cách khác là tăng trọng lượng quả banh lên b.setWeight(b.getWeight()+15); //Ném đối tượng về cho trình khách return b;
}
}
• Trình chủ tiếp nhận quả bóng từ trình khách, tăng trọng lượng của quả
bóng lên và ném trả về cho trình khách
27
g n ũ D n ấ T õ V
:
V G
qua lớp PingServerImpl với mã nguồn như sau:
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 4)
• Bước 4: Thiết kế chương trình Setup cài đặt đối tượng
/*Setup.java*/ import java.rmi.*; import java.rmi.server.*;
public class Setup{
public static void main(String args[]) throws Exception{
//kiến tạo đối tượng PingServer server=new PingServerImpl(); //thông báo khả năng giao tiếp được từ xa của đối tượng với máy ảo Java UnicastRemoteObject.exportObject(server); //đăng ký đối tượng với dịch vụ rmiregistry //thay localhost bằng địa chỉ IP thật sự nếu bạn làm việc trên mạng Naming.bind(“rmi://localhost/pingobject”, server); System.out.println(“Waiting for client request…”);
}
}
28
g n ũ D n ấ T õ V
:
V G
PingServerImpl trên máy chủ
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 5)
• Bước 5: Thiết kế chương trình Client gọi phương thức của
/*Client.java*/ import java.rmi.*;
public class Client{
public static void main(String args[]) throws Exception{
//tạo quả banh có trọng lượng là 12 Ball ball=new Ball(12); //yêu cầu rmiregistry truy tìm đối tượng PingServer PingServer server=(PingServer)
Naming.lookup(“rmi://localhost/pingobject”);
System.out.println(“Ball weight before send to server “ +ball.getWeight()); Ball anotherBall=server.ping(ball); System.out.println(“Ball weight return by server “+anotherBall.getWeight());
}
}
29
g n ũ D n ấ T õ V
:
V G
đối tượng PingServer.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 6)
• Bước 6: Biên dịch chương trình, ta lưu tất cả mã nguồn vào thư mục C:\RMI\ByValue. chuyển vào thư mục này thực hiện lệnh biên dịch.
C:\RMI\ByValue>javac *.java
• Tiếp đến tạo các tập tin trung gian Stub và Skeleton: C:\RMI\ByValue>rmic PingServerImpl
• Kết quả ta thu được các tập tin sau:
30
g n ũ D n ấ T õ V
:
V G
PingServer.class PingServerImpl.class PingServerImpl_Stub.class PingServerImpl_Skel.class Setup.class Client.class
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM TRỊ (step 7)
• Bước 7: Cài đặt đối tượng và thực thi chương trình. Bạn gõ
từ cửa sổ DOS-promp các lệnh sau:
• Khởi động bộ đăng ký rmiregistry
C:\RMI\ByValue>start rmiregistry
• Gọi trình Setup để đăng ký đối tượng PingServer:
C:\RMI\ByValue>start java Setup
Waiting for client request…
Client send a Ball object weight 12 • Chạy chương trình khách Client:
31
g n ũ D n ấ T õ V
:
V G
C:\RMI\ByValue>java Client Ball weight before send to server 12 Ball weight after send to server 12 Ball weight return by server 27
CHUYỂN ĐỐI TƯỢNG ĐẾN TRÌNH CHỦ THEO THAM CHIẾU
g n ũ D n ấ T õ V
:
V G
CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU
• Nếu đối tượng quá lớn thì việc 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 trình khách không cần chuyển đối tượng cho trình chủ theo tham trị mà là theo tham chiếu.
• Như vậy đối tượng trên trình khách phải cài đặt giao tiếp Remote, phải sinh lớp trung gian Stub và Skel, phải đăng ký với rmiregistry để trình chủ có thể tham chiếu đến (tương tự như khi cài đặt trên trình chủ). • Với Java, các đối tượng nếu cài đặt giao tiếp Remote sẽ được xem như có khả năng chuyển qua mạng thông qua tham chiếu chứ không cần đóng gói chuyển theo tham trị như trường hợp cài đặt lớp Serializable.
• 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 thiết lập các yêu cầu tùy biến không phải lệ thuộc nhiều vào trình chủ.
33
g n ũ D n ấ T õ V
:
V G
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU
• Sau đây ta sẽ 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. • Ta sẽ tạo một đối tượng AtClient chạy trên máy khách và
34
g n ũ D n ấ T õ V
:
V G
đối tượng AtServer chạy trên máy chủ
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 1)
/* AtClient.java*/ import java.rmi.*; public interface AtClient extends Remote {
public void callClientMethod(String message) throws RemoteException;
}
35
g n ũ D n ấ T õ V
:
V G
• Bước 1: Đặc tả giao tiếp interface cho đối tượng AtClient
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 2)
/* AtServer.java*/ import java.rmi.*; public interface AtServer extends Remote {
public void registerClient(AtClient c) throws RemoteException; public void callServerMethod(String message) throws RemoteException;
}
36
g n ũ D n ấ T õ V
:
V G
• Bước 2: Đặc tả giao tiếp interface cho đối tượng AtServer
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 3)
• Bước 3: Cài đặt chi tiết cho đối tượng AtClient thông qua
/* AtClientImpl.java*/ import java.rmi.*; public class AtClientImpl implements AtClient {
public void callClientMethod(String message) throws RemoteException{
System.out.println(message);
}
}
37
g n ũ D n ấ T õ V
:
V G
lớp AtClientImpl.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 4)
• Bước 4: Cài đặt chi tiết cho đối tượng AtServer thông qua
/* AtServerImpl.java*/ 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);
}
}
}
38
g n ũ D n ấ T õ V
:
V G
lớp AtServerImpl.
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 5)
đăng ký đối tượng AtServer với rmiregistry.
/* Setup.java*/ import java.rmi.*; import java.rmi.server.*;
public class Setup {
public static void main(String args[]) throws Exception{
//kiến tạo đối tượng chủ AtServer server=new AtServerImpl(); //thông báo khả năng giao tiếp được từ xa của đối tượng với mý ả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 ...");
}
}
39
g n ũ D n ấ T õ V
:
V G
• Bước 5: Xây dựng chương trình cài đối tượng AtServer trên máy chủ và
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 6)
AtServer.
/* Client.java*/ import java.rmi.*; import java.rmi.server.*; public class Client {
public static void main(String args[]) throws Exception{
//Khởi tạo đối tượng của trình khách AtClient client=new AtClientImpl(); UnicastRemoteObject.exportObject(client); AtServer server=(AtServer)Naming.lookup("rmi://localhost/serverobject"); server.registerClient(client); server.callServerMethod("Client Contact Server");
}
}
40
g n ũ D n ấ T õ V
:
V G
• Bước 6: Thiết kế chương trình Client gọi phương thức của đối tượng
VÍ DỤ CHUYỂN ĐỐI TƯỢNG THEO THAM CHIẾU (step 7)
• Bước 7: Biên dịch và chạy chương trình, ta lưu tất cả mã nguồn của chương trình vào thư mục C:\RMI\ByRef, chuyển vào thư mục này để biên dịch mã nguồn.
C:\RMI\ByRef>javac *.java
• Tạo tập tin trung gian Stub và Skel cho cả AtServer và AtClient C:\RMI\ByRef>rmic AtServerImpl C:\RMI\ByRef>rmic AtClientImpl
• Khởi động rmiregistry
• Cài đặt đối tượng trên máy chủ:
C:\RMI\ByRef>start rmiregistry
• Chạy chương trình khách:
C:\RMI\ByRef>start java Setup
41
g n ũ D n ấ T õ V
:
V G
C:\RMI\ByRef>java Client
PHẦN 4 MỘT SỐ VẤN ĐỀ KHÁC
g n ũ D n ấ T õ V
:
V G
MỘT SỐ VẤN ĐỀ KHÁC
• Một số vấn đề như:
– Tuần tự hóa đối tượng (Serializable). – Dùng một đối tượng sản sinh nhiều đối tượng (Factory
Object)
– Gọi đối tượng từ xa bằng phương pháp động (Dynamic
Method Invoke)
Xem trong Chương hai, sách “Java tập 2”, tác giả Phương
43
g n ũ D n ấ T õ V
:
V G
Lan, NXB Thống Kê, năm 2004.
HẾT BÀI 3
g n ũ D n ấ T õ V
:
V G