1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Bài giảng lập trình ứng dụng mạng bài 3 GV võ tấn dũng

44 319 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 44
Dung lượng 390,37 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• RMI Remote Method Invoke – có nghĩa là gọi phươngthức từ xa là cách thức giao tiếp giữa các đối tượngJava có mã lệnh cài đặt nằm trên máy khác nhau có thểgọi lẫn nhau... Các đối tượng

Trang 1

GIẢNG VIÊN:

VÕ TẤN DŨNG

LẬP TRÌNH ỨNG DỤNG MẠNG

BÀI 3

TRƯỜNG CAO ĐẲNG CÔNG NGHỆ THÔNG TIN TP.HCM

Trang 2

PHẦN 1

GIỚI THIỆU TỔNG QUAN VỀ RMI

Trang 3

TỔNG QUAN VỀ RMI

• Thông thường các chương trình của chúng ta được viếtdướ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ênmáy cục bộ Vậy thì có cách nào nạp nội dung của hàmhay đối tượng ở một máy nào đó và gọi chúng từ mộtmáy khác hay không?

• RMI (Remote Method Invoke – có nghĩa là gọi phươngthức từ xa) là cách thức giao tiếp giữa các đối tượngJava có mã lệnh cài đặt nằm trên máy khác nhau có thểgọi lẫn nhau

Trang 4

Remote Machine (Server)

public int sum(int a,int b) {

Trang 5

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 haimá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 Phía máy chủ, lớp trung gian này được gọi là Skeleton

Trang 6

Computer B

A1A2

Trang 7

CƠ CHẾ HOẠT ĐỘNG CỦA RMI

• Đầu tiên RMI-server đăng

ký tên của nó với bộ

Skeleton gọi phương thức

từ xa rồi đóng gói kết quả

Trang 8

• 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

GIAO TIẾP STUB-SKELETON

Trang 9

PHẦN 2

THIẾT KẾ ỨNG DỤNG PHÂN TÁN RMI

Trang 10

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)

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

CÁC BƯỚC XÂY DỰNG MỘT RMI

Trang 11

Để 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.

Step 1: ĐỊNH NGHĨA MỘT REMOTE INTERFACE

Trang 12

C:\RMI>javac CalculatorImpl.java nD

Trang 13

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:

Step 2: HIỆN THỰC REMOTE INTERFACE (tt)

/* 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();

Trang 14

public class CalculatorClient {

public static void main(String args[]) { try{

//tìm đối tượng cần truy xuất theo tên

}

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

Trang 15

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:

Trang 16

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:

Trang 17

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

Trang 18

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 7: KHỞI ĐỘNG CÁC ĐỐI TƯỢNG PHÍA SERVER

Trang 19

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:

Step 8: CHẠY CHƯƠNG TRÌNH PHÍA CLIENT

Trang 20

PHẦN 3

VẤN ĐỀ CHUYỂN THAM SỐ TRONG

LỜI GỌI PHƯƠNG THỨC TỪ XA

Trang 21

• Đối với việc truyền tham số qua mạng theo cơ chế RMI thì có 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 trong hai 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ị.

• 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ị.

Trang 22

CHUYỂN ĐỐI TƯỢNG ĐẾN

TRÌNH CHỦ THEO THAM TRỊ

Trang 23

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

số và dữ liệu qua lại giữa hai lớp trung gian Stub vàSkeleton được gọi là mashaling và un-mashaling

• Trong các lời gọi phương thức RMI, kiểu dữ liệu đối tượngnếu không cài đặt một trong hai giao tiếp Serializable hoặcRemote thì sẽ không thể dùng làm tham số truyền qua mạng được

Trang 24

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 đếnmáy chủ trong RMI

• 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ìnhchủ sẽ tiếp nhận quả banh và trả về cho trình khách

Trang 25

• Bước 1: 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ủ

Trang 26

public interface PingServer extends Remote{

public Ball ping(Ball b) throws RemoteException;

}

• PingServer được đặt trên trình chủ Đối tượng PingServercủ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ươngthứ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 khitiếp nhận sẽ ném trả về đối tượng Ball cho trình kháchthông qua trị trả về của trình khách

Trang 27

• 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:

/* 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

Trang 28

• Bước 4: Thiết kế chương trình Setup cài đặt đối tượng

PingServerImpl trên máy chủ

/*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…”);

}

}

Trang 29

• Bước 5: Thiết kế chương trình Client gọi phương thức của

đối tượng PingServer

/*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

Trang 30

• 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àythực hiện lệnh biên dịch

Client.class

Trang 31

• 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:

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

Trang 32

CHUYỂN ĐỐI TƯỢNG ĐẾN

TRÌNH CHỦ THEO THAM CHIẾU

Trang 33

• 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ủ.

Trang 34

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àđối tượng AtServer chạy trên máy chủ

Trang 35

public interface AtClient extends Remote {

public void callClientMethod(String message) throws RemoteException;

}

Trang 36

public interface AtServer extends Remote {

public void registerClient(AtClient c) throws RemoteException;

public void callServerMethod(String message) throws RemoteException;

}

Trang 37

public class AtClientImpl implements AtClient {

public void callClientMethod(String message) throws RemoteException{

System.out.println(message);

}

}

Trang 38

for (int i=1; i<10; i++){

String msg= "Server response "+ Math.random()*1000;

client.callClientMethod(msg);

} }

}

Trang 39

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

Trang 40

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();

Trang 41

• 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

• Chạy chương trình khách:

C:\RMI\ByRef>java Client

Trang 43

– 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ươngLan, NXB Thống Kê, năm 2004

Trang 44

BÀI 3

Ngày đăng: 03/12/2015, 13:56

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w