Tài liệu: Chuyển tham số trong các lời gọi từ xa

Tài liệu
Khoa CNTT ĐHSP KT Hưng Yên

Tóm tắt nội dung

-
Chuyển tham số trong các lời gọi từ xa

Nội dung

Chuyển tham số theo tham trị và tham biến.

Đối với Java,trên máy cục bộ hầu hết biến kiểu đối tượng đều truyền theo tham chiếu trong các lời gọi hàm .Nghĩa là một kkhi biến đối tượng được truyền vào phương thức nếu bên trong phương thức thay đổi giá trị của đối tượng thì khi lời gọi phương thức chấm dứt giá trị của đối tượng cũng thay đổi theo.

Ví dụ :

Class Number{

Public int value=0;

Public Number(int v){

Value=v;

}

}

Public class Program{

Public static void main(String[] args){

Number num=new Number(12);

DoIncrease(num);

System.out.Println(num.value);

}

Public static void doIncrease(Number n){

n.value++;

}

}

ở ví dụ trên ta tạo ra đối tượng Number lưu một giá trị nguyên Integer.Phương thức doIncrease() tiếp nhận tham số Num có kiểu đối tượng là Nuamber giá trị khởi đầu là 12 .Bên trong phương thức doIncrease() biến đối tượng được tăng giá trị lên 1.Kết quả khi lời gọi phương thức chấm dứt đối tượng Num được tăng trị lên 13.

Tuy nhiên các kiểu dữ liẹu nguyên tố như int ,float .double,char ,byte,long…lại được truyền theo trị.Giá trị tham số mà hàm hay phương thức xử lý chỉ là bản sao của biến truyền từ ngoài vào .Ví dụ sau sẽ cho kết quả là 12 sau khi gọi phương thức doIncrease().

Public class Program{

Public static void main(String[] args){

Int Num=12;

doIncrease(Num);

System.out.println(Num);

}

Public static void doIncrease(int n){

n++;

}

}

Tóm lại 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ị .Thế còn truyền tham số qua mạng theo cơ chế RMI thì sao?Thực sự truyền tham số cho các lời gọi phương thức từ xa trong RMI có hơI khác với nguyên tắc truyền tham số thông thường .Bạn hãy nhớ lại hai nguyên tắc sau:

*Tất cả các kiểu dữ liệu đơn giản như int ,char …dề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 trong hai giao tiếp Remote hoặc Serializable.Các đối tượng cài đặt 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ị.

Chuyển đối tượng đến trình chủ theo tham trị.

Hầu như các kiểu dữ liệu đối tượng cơ bản như String ,date,time…trong Java đều caì đặt giao tiếp Serializable cho lên cúng được truyền cho các lời gọi hàm hay phương thức ở xa theo trị.

Với cơ chế truyền tham số đối tượng theo trị,khi bạn gọi một phương thức của đối tượng ở xa,nếu trong lời gọi phương thức này có yêu cầu tham số là kiểu đối tượng,đối tượng sẽ được đóng gói và chuyển toàn bộ đến máy chủ .Tại máy chủ đối tượng sẽ được bung ra lại trạng thái ban đầu và đưa vào sử dụng.Quá trình đóng gói trên máy khách để chuyển đI được thực hiện bởi lớp trung gian_Stub,ngược lại quá trình mở gói dữ liệu để khôI phục tham số diễn ra trên máy chủ được thực hiện bởi lớp trung gian _Skel. Qui trình chuyển tham số và sữ liệu qua lại giữa hai lớp trung gian _Stub và _Skel trong thuật ngữ lạp trình phân tán gọi là mashaling data.

Xây dựng chương trình chuyển tham số đối tượng qua mạng.

Dưới đây là một chương trình ví dụ cho thấy cách chuyển đổi một đối tượng từ máy khách đến máy chủ .Chương trình của chúng ta tựa trò chơI ném bóng , trình khách sẽ ném một quả bóng lên máy chủ , trình chủ sẽ tiếp nhận quả bóng và trả về cho trình khách.

Bước1: Thiết kế lớp Ball.class được dùng làm tham số chuyển qua mạng giữa trình khách và trình chủ , được cài đặt như sau:

+ Ví dụ: Ball.class

Import java.io.*;

Public class Ball implements Serializable{

Int weight =o;

Public Ball(int w){

Weght=w;

}

Public int getweight(){

Return weight;

}

Public void setweight(int w){

Weight=w;

}

}

Lớp Ball chỉ dùng để biểu diễn một quả bóng có trọng lượng weight. Bnạ có thể gọi hàm getweight(), setweight() để lấy về hoặc thiết lập trọng lượng cho qaủ bóng . Mục đích của ta là sử dụng đối tượng Ball để chuyển đI trên mạng giữa trình khách và trình chủ cho nên lớp Ball được khai báo là có khả năng tuần tự hóa

Public class Ball implements Serializable{

}

Nừu bạn cảm thấy từ ngữ “tuần tự hóa ” hay “Serializable” nghe có thể khó hiểu cũng không nên bận tâm .

Bước 2: Đặc tả giao tiếp Interface cho đối tượng trên máy chủ.

+ Ví dụ: pingServer.java

Import java.rmi.*;

Public interface PingServer extends Remote{

Public Ball ping(Ball b) thows RemoteException;

}

PingServer được đặt lê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 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 Ballcho trình khách thông qua trị trả về của phương thức.

Bước 3: Cài đặt chi tiết cho đối tượng pingServer thông qua lớp PingServerImpl với mã nguồn như sau:

+Ví dụ: PingServerImpl.java

Import java.rmi.*;

Public class PingServerImpl implements PingServer{

Public Ball ping(Ball b) thows RemoteException{

System.out.println(“client send a ball objectweight”+b.getWeight());

b.setWeight(b.getWeight()+15);

return b;

}

}

Trình chủ của ta tiếp nhận quả bóng từ trình khách . Tăng trọng lượng của bóng lên và ném trả về cho trình khách

Bước 4: Thiết kế chương trình Setup cài đặt đối tượng PingServerImpl trên máy chủ.

+Ví dụ: Setup.java

Import java.rmi.*;

Import java.rmi.server.*;

Public class Setup{

Public static void main(String[] args) thows Exception{

PingServer server=new PingServerImpl();

UnicastRemoteObject.exportOb ject(server);

Naming.bind(“rmi://localhost/pingobject”,server);

System.out.println(“Waiting for client request…”);

}

}

Bước 5: Thiết kế chương trình client gọi phương thức của đối tượng PingServer.

+ Ví dụ: Client.java

Import java.rmi.*;

public class client {

public static void main(String[]arge) thows Exception {

Ball ball=new Ball(12);

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 after send to server ”+ball.getWeight());

System.out.println(“ball weight return by server ”+anotherBall.getWeight());

}

}

Bước 6:Biên dịch chương trình bạn 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 c:\RMI\ByValue\>javac *.java tiếp đến tạo các tập tin trung gian _Stub và _Skel bằng lệnh:

C:\RMI\ByValue\>rmic PingServerImpl

Kết quả thu được các tệp tin sau:

Ball.class

PingServer.class

PingServerImpl_Stub.class

PingServerImpl_Skel.class

Setup.class

Client.class

Bước 7: Cài đặt đối tượng và thưc thi chương trình

  • khởi động bộ đăng ký Rmiregistry:

C:\RMI\ByVlaue\>Start rmiregistry

  • gọi trình Setup để đăng ký đối tượng PingServer

C:\RMI\ByValue\>Start java Setup

Chuyển đối tượng đến trình chủ theo tham chiếu

Nếu đối tượng Ball quá lớn thì sao

Đóng gói toàn bộ đối tượng chuyển đi

Chuyển lại trên mạng sẽ ảnh hưởng tới

Tốc độ thực thi của chương trình . Có cách nào mà trình chủ cói thể tham chiếu và xử lý trực tiếp được đối tượng dang nằm trên máy khách hay không ? có nghĩa là nếu trình chủ được trình khách truy xuất từ xa thì chính trình khách ngược lại cũng có thể được gọi từ xa bằng trình chủ

Xây dựng chương trình chuyển đối tượng qua mạng theo tham chiếu

Chúng ta sẽ tạo ra hai đối tượng. Đối tượng Atclient chạy trên máy khách và đối tượng AtServer chạy trên máy chủ như thường lệ ,trình khách sẽ liên lạc với bộ đăng ký rmiregitry để tìm tham chiếu đên đối tượngAtServer trên máy chủ tiếp đến trình khách sẽ tạo ra đối tượng Atclient ngay trên máy khách và gọi phương thức của đối tượng AtServer từ xa để đăng ký đối tượng Atclient với trình chủ

Bước 1: Đặc tả giao tiếp interface cho đối tượng Atclient.

Ví dụ: Atclient.java

Import java.rmi.*;

Public interface Atclient extends Remote{

Public void callClientMethod(String message) thows RemoteException;

}

Đối tượng Atclient của ta đặt trên máy khách và muốn có khả năng gọi được từ máy chủ,java yêu cầu bạn phảI áp đặt giao tiếp Remote cho lớp đối tượng này. Và tương tự như cách cài đặt cho các đối tượng trên máy chủ trước đây , phương thức được triệu gọi từ xa CallClientMethod() phảI có khả năng ném ra ngoại lệ RemoteException. Sau này bạn sẽ thấy callClientMethod() được gọi bởi đối tượng AtServer trên máy chủ.

Bước 2: Đặc tả giao tiếp interface cho đối tượng AtServer

Ví dụ:AtServer.java

Import java.rmi.*;

Public interface AtServer extends Remote{

Public void RegisterClient(AtClient c) thows RemoteException;

Public void CallServerMethod(String Message) thows RemoteException;

}

Đối tượng AtServer của ta cung cấp hai phương thức , phương thức thứ nhất RegisterClient() dùng để tiếp nhận tham chiếu đến đối tượng AtClient trên trình máy khách. Phương thức thứ hai callServerMethod() được dùng để cung cấp các dịch vụ cho trinhf khách

Bước 3: Cài đặt chi tiết cho đối tượng Atclient thông qua lớp AtClientImpl.

Ví dụ: AtClientImpl.java

Import java.rmi.*;

Public class AtClientImpl implements AtClient{

Public void callClientMethod(String message) throws RemoteException{

System.out.println(message);

}

} Bước 4:Cài đặt chi tiết cho đối tượng AtServer thông qua lớp AtServerImpl.

Ví dụ :AtServerImpl.java

Import java.rmi.*;

Public class AtServerImpl implements AtServer{

Atclient client;

Public void registerClient (AtClient c) throws RemoteException()_Public void RegisterClient(AtClient c) thows RemoteException{client=c;}

}

Public void callServerMehtod(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);

}

}

Bước 5: Xây dựng chương trình cài đặt đối tượng AtServer trên máy chủ va đăng ký đối tượng AtServer với rmiregistry.

Ví dụ: Setup.java

Import java.rmi.*;

Import java.rmi.server.*;

Public class setup{

Public static void main(String[] args) throws Exception{

AtServer server=new AtServerImpl();

UnicastRemoteObject.exportObject(server);

Naming.bind(“rmi://localhost/serverobject”,server);

System.out.println(“waiting for client request…”);

}

}

Bước 6: thiết kế chương trình clientgọi phương thức của Atserver.

Ví dụ: Client.java

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) Namin.lookup(“rmi://localhost/serverobject”);

Server.registerClient(client);

Server.callServerMethod(“client contact Server”);

}

}

Bởi vì AtClient là một đối tượng có khả năeng tham chiếu xa cho nên tương tự đối tượng trên máy chủ chúng ta phảI gọi unicastRemoteObject() để thông báo sự hiện diện và khả năng giao tiếp của đối tượng AtClient với máy ảo java. Sau khi lấy về tham chiếu đến đối tượng trên máy chủ. Phương thức này mục đích này là truyền tham chiếu của AtClient từ trình khách lên trình chủ. Bằng cách này trình chủ không còn phảI dùng đến hàm Naming.lookup() truy tìm tham chiếu đến đôI tượng AtClient của khách trên máy rmiregistry.

Bước 7: Biên dịch và chạy chương trình ,bạn lưu tất cả mã nguồn của chương trình vào thư mục C:\RMI\Byef. Chuyển vào thư mục này để biên dịch mã nguồn.

C:\RMI\Byef\>javac *.java

Phát triển Hệ thống phân tán



Nguồn: voer.edu.vn/m/chuyen-tham-so-trong-cac-loi-goi-tu-xa/aa76d1b2


Chưa có phản hồi
Bạn vui lòng Đăng nhập để bình luận