TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG LẬP TRÌNH MẠNG

12 904 2
TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG LẬP TRÌNH MẠNG

Đ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

TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG LẬP TRÌNH MẠNG

Chương 10 TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG LẬP TRÌNH MẠNG Tuần tự hóa đối tượng 1.1 Khái niệm Tuần tự hóa q trình chuyển tập hợp thể đối tượng chứa tham chiếu tới đối tượng khác thành luồng byte tuyến tính, luồng gửi qua Socket, lưu vào tệp tin xử lý dạng luồng liệu Tuần tự hóa chế sử dụng RMI để truyền đối tượng máy ảo JVM dạng tham số lời gọi phương thức từ client tới server giá trị trả từ lời gọi phương thức Tuần tự hóa chế xây dựng đưa vào lớp thư viện Java để chuyển đồ thị đối tượng thành luồng liệu Luồng liệu sau xử lý cách lập trình ta tạo lại đối tượng ban đầu nhờ trình ngược lại gọi giải hóa Tuần tự hóa có ba mục đích sau • Cơ chế ổn định: Nếu luồng sử dụng FileOuputStream, liệu tự động ghi vào tệp • Cơ chế chép: Nếu luồng sử dụng ByteArrayObjectOuput, liệu ghi vào mảng byte nhớ Mảng byte sau sử dụng để tạo đối tượng ban đầu • Nếu luồng sử dụng xuất phát từ Socket liệu tự động gửi tới Socket nhận, chương trình khác định phải làm liệu nhận Một điều quan trọng khác cần ý việc sử dụng hóa độc lập với thuật tốn hóa 1.2 Khả (Serializable) Chỉ có đối tượng thực thi giao diện Serializable ghi lại phục hồi tiện ích hóa Giao diện Serializable khơng định nghĩa thành phần Nếu lớp thực thi giao diện Serializable lớp có khả hóa Một lớp khả tất lớp khả Giao diện ObjectOutput thừa kế từ giao diện DataOutput hỗ trợ hóa đối tượng Lớp ObjectOuputStream lớp lớp ObjectOuput thực thi giao diện ObjectOutput Nó có nhiệm vụ ghi đối tượng vào luồng cách sử dụng phương thức writeObject(Object obj) ObjectInput thừa kế giao diện DataInput định nghĩa phương thức Nó hỗ trợ cho việc hóa đối tượng Phương thức readObject() gọi để giải hóa đối tượng ObjectInputStream định nghĩa gói java.io luồng cài đặt chế đọc trạng thái luồng nhập đối tượng Một vấn đề đặt là: liệu lớp Java có khả hóa? Câu trả lời khơng, khơng cần thiết khơng có ý nghĩa hóa số lớp định Để xác định xem lớp có khả hay khơng ta sử dụng cơng cụ serialver có JDK Hình Hình Với kết cho ta thấy lớp khả Nhưng lớp Java khả chẳng hạn ta thử kiểm tra với lớp java.net.Socket Hình Khi kết hiển thị Class java.net.Socket is not Serializable (Lớp java.net.Socket không khả tuần tự) 1.3 Xây dựng lớp lớp khả Đối với lớp người lập trình định nghĩa ta phải khai báo để báo hiệu cho hệ thống biết có khả hay khơng Một lớp người dùng định nghĩa có khả hóa lớp thực thi giao diện Serializable Trong ví dụ ta định nghĩa lớp Point để lớp có khả hóa public class Point implements Serializable { private double x,y; public Point(double x,double y){ this.x=x; this.y=y; } public double getX(){ return x; } public double getY(){ return y; } public void move(double dx,double dy){ x+=dx; y+=dy; } public void print(){ System.out.println("Toa cua diem la:"); System.out.println("Toa x="+x); System.out.println("Toa y="+y); } } 1.4 Cơ chế đọc ghi đối tượng thiết bị lưu trữ Chúng ta biết tất thao tác nhập xuất liệu Java thực chất việc đọc ghi luồng liệu vào luồng liệu Việc đọc ghi đối tượng thiết bị lưu trữ khơng phải ngoại lệ Chúng ta thấy chế qua hình ObjectInputStream FileInputStream Serializable Object File ObjectOuputStream FileOuputStream Hình Giả sử đối tượng obj đối tượng khả Bản thân đối tượng khả người lập trình định nghĩa nên thuộc tính khả cho Cơ chế ghi đối tượng tiến hành đơn giản: Trước tiên ta tạo tệp để ghi thông tin, thực chất tạo đối tượng FileOuputStream, sau ta tạo luồng ghi đối tượng ObjectOuputStream gắn với luồng ghi tệp gắn kết hai luồng với Việc ghi đối tượng thực phương thức writeObject() FileOuputStream fos=new FileOuputStream("date.out"); ObjectOuputStream oos=new ObjectOuputStream(fos); Date d=new Date(); oos.writeObject(d); Quá trình gọi trình hóa Chúng ta nhận thấy để phục hồi lại trạng thái đối tượng ta phải mở tệp để đọc liệu Nhưng ta đọc trực tiếp mà phải thông qua luồng nhập đối tượng ObjectInputStream gắn với luồng nhập tệp tin FileInputStream Việc đọc lại trạng thái đối tượng tiến hành nhờ phương thức readObject() FileInputStream fis=new FileInputStream("date.out"); ObjectInputStream ois=new ObjectInputStream(fis); Date d=(Date)ois.readObject(); Q trình cịn gọi giải hóa Cơng việc đọc ghi trạng thái đối tượng khả người lập trình định nghĩa tiến hành hoàn toàn tương tự Truyền đối tượng thông qua Socket Chúng ta biết cách ghi đọc đối tượng từ luồng vào tiến trình đơn, xem xét cách truyền đối tượng thơng qua Socket Mơ hình lập trình Socket cho giao thức TCP mơ hình phổ biến lập trình mạng Để lập chương trình client/server Java ta cần hai lớp Socket ServerSocket 2.1 Lớp Socket Lớp Socket Java sử dụng client server, có phương thức tương ứng với bốn thao tác Ba thao tác cuối cần cho server để chờ client liên kết với chúng Các thao tác cài đặt lớp ServerSocket Các Socket cho client thường sử dụng theo mơ hình sau: Một Socket tạo cách sử dụng hàm dựng Socket() Socket cố gắng liên kết với host xa Mỗi liên kết thiết lập, host xa nhận luồng vào luồng từ Socket, sử dụng luồng để gửi liệu cho Kiểu liên kết gọi song công (full-duplex), host nhận gửi liệu đồng thời Ý nghĩa liệu phụ thuộc vào giao thức Khi việc truyền liệu hoàn thành, hai phía ngắt liên kết Một số giao thức, HTTP, đòi hỏi liên kết phải bị đóng sau yêu cầu phục vụ Các giao thức khác, chẳng hạn FTP, cho phép nhiều yêu cầu xử lý liên kết đơn 2.2 Lớp ServerSocket Lớp ServerSocket có đủ thứ ta cần để viết server Java Nó có constructor để tạo đối tượng ServerSocket mới, phương thức để lắng nghe liên kết cổng xác định phương thức trả Socket liên kết thiết lập, ta gửi nhận liệu Vịng đời server Một ServerSocket tạo cổng xác định cách sử dụng constructor ServerSocket ServerSocket lắng nghe liên kết đến cổng cách sử dụng phương thức accept() Phương thức accept() phong tỏa client thực liên kết, phương thức accept() trả đối tượng Socket biểu diễn liên kết client server Tùy thuộc vào kiểu server, phương thức getInputStream(), getOuputStream() hai gọi để nhận luồng vào phục vụ cho việc truyền tin với client Server client tương tác theo giao thức thỏa thuận sẵn ngắt liên kết Server, client hai ngắt liên kết Server trở bước hai đợi liên kết 2.3 Truyền nhận liệu mơ hình lập trình Socket Việc truyền nhận liệu thực chất thao tác đọc ghi Socket Ta thấy điều qua sơ đồ đây: InputStream Socket Program ObjectOuput Hình Giả sử s đối tượng Socket Nếu chương trình nhận liệu ta lấy liệu từ luồng nhập đến từ Socket: InputStream is=s.getInputStream() Để phục hồi trạng thái đối tượng ta gắn kết luồng nhập thô lấy từ Socket với luồng đọc đối tượng ObjectInputStream: ObjectInputStream ois=new ObjectInputStream(is); Khi đối tượng phục hồi lại trạng thái câu lệnh: Object obj=(Object)ois.readObject(); Nếu chương trình gửi liệu ta lấy liệu từ luồng xuất đến từ Socket: ObjectOuput os=s.getObjectOuput(); Để tiến hành ghi đối tượng ta gắn kết luồng xuất thô lấy từ Socket với luồng xuất đối tượng ObjectOuputStream: ObjectOuputStream oos=new ObjectOutputStream(os); Việc truyền đối tượng lúc trở thành cơng việc đơn giản: oos.writeObject(obj); oos.flush(); 2.4 Ví dụ minh họa Để minh họa kỹ thuật viết server thực phép nhân hai mảng số nguyên với Client gửi hai đối tượng, đối tượng biểu diễn mảng nguyên; server nhận đối tượng này, thực lời gọi phương nhân hai mảng số nguyên với gửi kết trả cho client Trước tiên định nghĩa đối tượng để sử dụng việc truyền đối tượng public class ArrayObject implements java.io.Serializable{ private int[] a=null; public ArrayObject(){ } public void setArray(int a[]){ this.a=a; } public int[] getArray(){ return a; } } Lớp ArrayObject lớp xây dựng để đóng gói mảng số nguyên có khả truyền qua lại mạng Cấu trúc lớp sau: trường thông tin mảng số nguyên a[]; phương thức setArray() thiết lập giá trị cho mảng Phương thức getArray() trả mảng số nguyên từ đối tượng ArrayObject Mơ hình client/server tối thiểu phải có hai mođun client server Trong ví dụ ta xây dựng số mođun chương trình sau: Đầu tiên phát triển client Client tạo hai thể đối tượng ArrayObject ghi chúng luồng xuất (thực chất gửi tới server) public class ArrayClient{ public static void main(String[] args)throws Exception{ ObjectOuputStream oos=null; ObjectInputStream ois=null; int dat1[]={3,3,3,3,3,3,3}; int dat2[]={5,5,5,5,5,5,5}; Socket s=new Socket("localhost",1234); oos=new ObjectOuputStream(s.getObjectOuput()); ois=new ObjectInputStream(s.getInputStream()); ArrayObject a1=new ArrayObject(); a1.setArray(dat1); ArrayObject a2=new ArrayObject(); a2.setArray(dat2); ArrayObject res=null; int r[]=new int[7]; oos.writeObject(a1); oos.writeObject(a2); oos.flush(); res=(ArrayObject)ois.readObject(); r=res.getArray(); System.out.println("The result received from server "); System.out.println(); for(int i=0;i

Ngày đăng: 05/09/2012, 15:51

Hình ảnh liên quan

ServerSocket. Các Socket cho client thường được sử dụng theo mô hình sau: 1.Một Socket mới được tạo ra bằng cách sử dụng hàm dựng Socket() - TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG LẬP TRÌNH MẠNG

erver.

Socket. Các Socket cho client thường được sử dụng theo mô hình sau: 1.Một Socket mới được tạo ra bằng cách sử dụng hàm dựng Socket() Xem tại trang 5 của tài liệu.
Hình 6 - TUẦN TỰ HÓA ĐỐI TƯỢNG VÀ ỨNG DỤNG TRONG LẬP TRÌNH MẠNG

Hình 6.

Xem tại trang 10 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan