TIỂU LUẬN LẬP TRÌNH MẠNG Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của 2 tiến trình ở xa

41 912 3
TIỂU LUẬN LẬP TRÌNH MẠNG Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của 2 tiến trình ở xa

Đ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

LỜI NÓI ĐẦU Hệ tin học phân tán là hệ thống tin học hiện đại, đa dạng, phức tạp và đang trên đà phát triển, được nhiều trường đại học, nhiều viện nghiên cứu, nhiều chuyên gia công nghệ thông tin, quan tâm nghiên cứu với nhiều công trình khoa học có giá trị về mặt nguyên lý, phương pháp cũng như ứng dụng trong thực tế. Mục đích của lập trình mạng phân tán là tận dụng các khả năng tính toán và khai thác dữ liệu của các hệ thống máy tính ở xa để thực hiện những tính toán nhanh hơn trên cơ sở sử dụng nhiều bộ xử lý, nhiều bộ nhớ đồng thời hoặc nhiều dữ liệu quý giá được phân tán khắp nơi. Trên nền hệ thống mạng máy tính được kết nối như hiện nay, việc xử lý phân tán sẽ giải quyết được những bài toán lớn hơn, phức tạp hơn của thực tế. Trong phạm vi của tiểu luận này chúng tôi chỉ đề cập đến hai phần: Phần 1: Lý thuyết về Lập trình mạng phân tán và RMI Phần 2: Bài tập: Áp dụng lý thuyết trật tự từng phần để thể hiện đồng bộ của 2 tiến trình ở xa, cụ thể hóa bằng bài toán người sản xuất – người tiêu thụ. Tiểu luận chắc chắn có nhiều sai sót. Kính mong sự chỉ bảo tận tình của Thầy giáo hướng dẫn cùng các anh chị và bạn bè đồng nghiệp. Xin trân trọng cám ơn Giáo sư TS. Lê Văn Sơn đã cung cấp kiến thức, tài liệu để tôi hoàn thành tiểu luận này. Xin cảm ơn các anh chị và bạn bè đồng nghiệp đã giúp đỡ, động viên và chia sẻ kinh nghiệm học tập nghiên cứu.

Tiểu luận mơn học Lập trình mạng hệ phân tán ĐẠI HỌC ĐÀ NẴNG KHOA CÔNG NGHỆ THÔNG TIN  TIỂU LUẬN MƠN HỌC: LẬP TRÌNH MẠNG Đề tài: Áp dụng lý thuyết trật tự phần để thể đồng tiến trình xa GV hướng dẫn : PGS.TS Lê Văn Sơn Chuyên ngành : Khoa Học Máy Tính Khóa : Tháng - 2009 Học viên : Nguyễn Anh Tuấn : Nguyễn Năng Hùng Vân ĐÀ NẴNG, 03/2010 HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán LỜI NÓI ĐẦU Hệ tin học phân tán hệ thống tin học đại, đa dạng, phức tạp đà phát triển, nhiều trường đại học, nhiều viện nghiên cứu, nhiều chuyên gia công nghệ thông tin, quan tâm nghiên cứu với nhiều cơng trình khoa học có giá trị mặt nguyên lý, phương pháp ứng dụng thực tế Mục đích lập trình mạng phân tán tận dụng khả tính tốn khai thác liệu hệ thống máy tính xa để thực tính tốn nhanh sở sử dụng nhiều xử lý, nhiều nhớ đồng thời nhiều liệu quý giá phân tán khắp nơi Trên hệ thống mạng máy tính kết nối nay, việc xử lý phân tán giải toán lớn hơn, phức tạp thực tế Trong phạm vi tiểu luận đề cập đến hai phần: Phần 1: Lý thuyết Lập trình mạng phân tán RMI Phần 2: Bài tập: Áp dụng lý thuyết trật tự phần để thể đồng tiến trình xa, cụ thể hóa toán người sản xuất – người tiêu thụ Tiểu luận chắn có nhiều sai sót Kính mong bảo tận tình Thầy giáo hướng dẫn anh chị bạn bè đồng nghiệp Xin trân trọng cám ơn Giáo sư TS Lê Văn Sơn cung cấp kiến thức, tài liệu để tơi hồn thành tiểu luận Xin cảm ơn anh chị bạn bè đồng nghiệp giúp đỡ, động viên chia sẻ kinh nghiệm học tập nghiên cứu Đà Nẵng, ngày 03/2010 HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán PHẦN I : CƠ SỞ LÝ THUYẾT LẬP TRÌNH MẠNG PHÂN TÁN VÀ RMI Mạng máy tính Phân tán Hệ thống tính toán phân tán đã tạo được bước ngoặc vĩ đại so với các hệ tập trung, và hệ khách chủ (Client/Server) Việc tính toán phân tán về bản cũng giống việc tính toán của hệ khách chủ phạm vi rộng lớn Dữ liệu được chứa nhiều máy chủ ở tại nhiều vị trí địa lý khác kết nối thông qua mạng diện rộng WAN hình thành các nơi làm việc, các phòng ban, các chi nhánh của một quan Tính toán phân tán hình thành từ tính toán tập trung và chient/server Các mạng được xây dựng dựa kỹ thuật Web (ví dụ như: Internet; intranet…) là các mạng phân tán Hệ thống sở dữ liệu back-end có thể được nối kết với các server Web để lấy được các thông tin động Kỹ thuật Web đã mở hướng mới cho hệ phân tán Các trình duyệt Web giúp cho khách hàng toàn cầu kết nối với hệ thống Web chủ, mà không bị khống chế bởi bất kỳ hệ điều hành nào chạy máy của khách hàng Một xu hướng mới xây dựng các intranet là dữ liệu phải được tập trung hóa tại một nhóm các máy chủ để có khả đáp ứng cùng một lúc cho nhiều người dùng Giờ các hệ thống mainframe đã thật sự trở lại vì tính xử lý mạnh mẽ Xu hướng có lẽ trái ngược với việc tính toán phân tán thực tế chúng cùng tồn tại bên Các điểm mạnh hệ tin học phân tán Cơ chế tính toán phân tán hỗ trợ truy cập các dữ liệu được lưu ở nhiều nơi Nhờ chế nhân bản nên người dùng chỉ cần truy cập cục bộ cũng lấy được các thông tin từ các trung tâm chính ở rất xa Hệ thống khắc phục được các hiểm họa địa phương Vì nếu không truy cập dữ liệu được tại vị trí này, có thể thử ở nơi khác Dữ liệu phân tán đòi hỏi phải được nhân bản và đồng bộ hóa cao thông qua các mối liên kết mạng, điều làm cho việc quản trị và giám sát phức tạp Một số nhà quản trị cho rằng, ở hệ thống thế sẽ gây khó khăn vấn đề bảo mật và điều khiển Hệ phân tán được xây dựng giao thức TCP/IP và các kỹ thuật Web cùng với các ứng dụng trung gian (middleware) thúc đẩy việc tính toán phân tán Quả thật là một đổi thay mang tính cách mạng Nhiệm vụ trước mắt là làm thế nào để chuyển tiếp sang hệ một cách khoa học Cơ chế Client/Server cung cấp kiến trúc phù hợp cho việc dàn trải hệ thống phân tán Mô tả nhiều cách truy cập các hệ thống phân tán Các máy mainframe sẽ dùng để lưu trữ các dữ liệu di sản hoặc đóng vai trò kho dữ liệu (data warehouse) Cơ chế giúp xây dựng các trung tâm dữ liệu staging (công bố), phục vụ tốt cho việc truy cập Người dùng ở xa có thể truy cập dữ liệu hệ staging hay tại các máy chủ cục bộ HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận môn học Lập trình mạng hệ phân tán Người dùng còn có thể trao đổi thông tin với bằng thư điện tử và hình thành các nhóm công tác Giới thiệu phương thức triệu gọi đối tượng từ xa RMI(Remote Method Invocation) Lập trình phân tán đối tượng cách triệu gọi phương thức từ xa RMI cách hợp tác đối tượng Java có mã lệnh cài đặt (bao gồm phương thức thuộc tính) nằm máy khác (chính xác nằm JVM – máy ảo Java khác nhau) triệu gọi lẫn để trao đổi tin Trong mơ hình Client/Server truyền thống, u cầu dịch sang format (dạng) trung gian (dạng cặp tên gọi / giá trị liệu XML) Máy chủ Server phân tích format yêu cầu, xử lý để có kết gửi trả lời cho máy khách Client Máy khách phân tích format trả lời hiển thị thông tin cho người sử dụng 3.1 Triệu gọi phương thức từ xa Cơ chế triệu gọi từ xa đơn giản mơ hình Client/Server Nếu ta cần truy cập tới đối tượng máy khác ta cần triệu gọi phương thức đối tượng máy Tất nhiên, tham số cách phải gửi đến cho máy đối tượng nhận phải chắn thực phương thức tương ứng để có thơng tin cần thiết gửi trả lại cho đối tượng khách hàng Máy khách Máy chủ Gửi yêu cầu liệu Trả lại thông tin yêu cầu Hình 1: Sự trao đổi đối tượng khách phục vụ (chủ) Tuy nhiên, việc triệu gọi phương thức đối tượng từ xa chắn phức tạp nhiều so với lời gọi hàm chương trình ứng dụng Các đối tượng hai máy ảo khác hoạt động hai tiến trình khác nhau, có hai khơng gian địa khác nhau, việc tham chiếu tới biến, địa đối tượng hoàn toàn khác Lời gọi hàm cục thường trả kết sau thực thành công, lời triệu gọi phương thức từ xa phải thơng qua kết nối mạng, bị tắc nghẽn, bị ngắt mạng gặp cố, … Đối với lời gọi hàm máy cục bộ, tham số truyền cho hàm thường đặt vào ngăn xếp, tham số truyền cho phương thức đối tượng xa phải đóng gói chuyển qua mạng theo giao thức chuẩn để đến đích với phương thức thực thông qua đại diện trung gian HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán 3.2 Kiến trúc RMI Java Mục đích kiến trúc RMI tạo mơ hình đối tượng phân tán tích hợp với ngơn ngữ lập trình Java Kiến trúc thành cơng việc tạo hệ thống an toàn kế thừa sức mạnh Java xử lý phân tán đa luồng Về bản, RMI xây dựng dựa kiến trúc ba tầng hình Chương trình khách Chương trình chủ Stub & Skeleton Hệ thống RMI Stub & Skeleton Tham chiếu từ xa Tham chiếu từ xa Tầng giao vận Hình 2: Kiến trúc ba tầng RMI - Hai lớp trung gian Stub Skeleton: chúng hệ thống tạo theo yêu cầu Các lớp chặn lời gọi phương thức chương trình khách (Client) tới biến tham chiếu gửi tới dịch vụ triệu gọi từ xa Lớp Skeleton liên lạc với Stub thông qua liên kết RMI Nó đọc tham số lời triệu gọi từ xa từ liên kết đó, thực lời gọi tới đối tượng thực thi dịch vụ từ xa sau gửi giá trị trả lại cho Stub Trong Java SDK, giao diện xây dựng làm cho Skeleton lỗi thời RMI sử dụng phép ánh xạ để thực việc kết nối tới đối tượng dịch vụ từ xa thay cho Skeleton - Tầng tham chiếu từ xa: tầng dịch quản lý tham chiếu tới đối tượng dịch vụ từ xa Ở JDK1.1, tầng thực kết nối theo chế điểm - tới - điểm Đến Java SDK, tầng cải tiến để nâng cao việc hỗ trợ để kích hoạt đối tượng dịch vu từ xa chờ thực thơng qua ROA, cách kết nối Client/Server - Tầng giao vận: dựa kết nối TCP/IP máy tính mạng Ngay hai chương trình chạy hai JVM máy, chúng thực kết nối thơng qua TCP/IP máy Tầng giao vận RMI thiết kế để thiết lập kết nối máy Client với máy Server Giả sử, ta có đối tượng C1 cài đặt chạy máy phục vụ C RMI Java giúp ta tạo hai lớp trung gian C1_Skel (không cần thiết Java SDK) C1_Stub Lớp C1_Stub nạp máy khách B Khi đối tượng B1 máy B triệu gọi C1, máy ảo Java chuyển lời gọi đến lớp C1_Stub C1_Stub chịu trách nhiệm đóng gói tham số chuyển chúng qua mạng đến cho máy C Tại máy C, lớp C1_Skel (C1_Stub nạp thay Java SDK) nhận tham số để chuyển vào không gian địa tương thích với đối tượng C1 sau gọi phương thức tương ứng để thực Kết có phương thức đối tượng C1 trả lớp C1_Skel (C1_Stub thay Java SDK) đóng gói trả ngược cho C1_Stub C1_Stub chuyển giao kết cuối cho B1 Theo chế này, hình dung B1 trao đổi trực tiếp với đối tượng C1 HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán máy Ngoài ra, với trợ giúp lớp trung gian C1_Stub, kết nối mạng gặp cố, lớp trung gian Stub biết cách thông báo lỗi đến đối tượng B1 Thực tế có câu hỏi là: Làm để B1 tham chiếu đến C1 khơng có lớp C1 cài đặt máy B? C1_Stub máy B làm lớp trung gian chuyển đổi tham số thực giao thức mạng, khơng phải hình ảnh đối tượng C1 Để làm điều đó, lớp đối tượng C1 cần cung cấp giao diện tương ứng, gọi giao diện từ xa với phương thức cho phép đối tượng B1 gọi máy B Stub thường trực máy khách, khơng máy chủ Nó có vai trị đóng gói thơng tin bao gồm:  Định danh đối tượng từ xa cần sử dụng  Mô tả phương thức cần triệu gọi  Mã hoá tham số truyền cho Skel Stub chuyển thông tin cho máy chủ Ở phía máy chủ, đối tượng Skel nhận thực công việc sau để gọi phương thức từ xa:  Giải mã tham số  Xác định đối tượng để thực lời gọi hàm tương ứng  Thực lời gọi phương thức theo yêu cầu  Tập hợp kết để trả lời thông báo lỗi ngoại lệ  Gửi trả lời gói liệu kết cho Stub máy khách C: Client Gọi hàm cục Stub Trả lại giá trị ngoại lệ :Stub :SKel Chuyển gói tham số S: Server Gọi hàm cục Server Gửi trả lại kết ngoại lệ Hình 3: Sự trao đổi đối tượng khách phục vụ thông qua đối tượng trung gian Hình mơ tả q trình tổ chức gói tham số, liệu trả lời trao đổi đối tượng trung gian kỹ thuật triệu gọi từ xa HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận môn học Lập trình mạng hệ phân tán Thiết lập môi trường triệu gọi từ xa Để thực việc triệu gọi từ xa ta phải chạy chương trình hai máy, máy khách máy chủ Những thông tin cần thiết phải cài đặt tách biệt hai phía, máy khách máy chủ Tuy nhiên khơng thiết phải có hai máy tính riêng biệt Nhờ có máy ảo Java, mở cửa sổ DOS-Prompt (môi trường DOS Window) để chạy chương trình Java, chương trình xem chạy máy (ảo) độc lập Do đó, hai chương trình Java chạy hai cửa sổ riêng xem chúng thực hai máy khác 4.1 Trên máy phục vụ (Server) 4.1.1 Thiết lập giao diện từ xa Trong Java, đối tượng từ xa thể lớp cài đặt giao diện Remote Tất phương thức giao diện từ xa phải khai báo public để máy JVM khác gọi Các giao diện từ xa phải đảm bảo tính chất sau: - Giao diện từ xa phải khai báo public - Giao diện từ xa kế thừa java.rmi.Remote - Mọi phương thức phải khai báo với mệnh đề throws để kiểm soát ngoại lệ java.rmi.RemoteException - Kiểu liệu đối tượng từ xa truyền giá trị nhận phải khai báo kiểu giao diện Remote, lớp Tất phương thức giao diện từ xa phải khai báo với throws Remote Exception triệu gọi từ xa nhiều nguyên nhân làm cho thất bại Ví dụ: máy chủ kết nối mạng khơng sẵn sàng, nhiều vấn đề khơng bình thường, ngoại lệ khác gặp phải mạng 4.1.2 Xây dựng lớp cài đặt giao diện từ xa Ở phía máy chủ, phải xây dựng lớp cài đặt phương thức khai báo giao diện từ xa Nói chung, lớp cài đặt đối tượng từ xa cần phải: - Khai báo cài đặt giao diện từ xa - Định nghĩa đối tượng từ xa - Cài đặt phương thức để triệu gọi từ xa Tất lớp Server phải kế thừa từ RemoteServer gói java.rmi.server, RemoteServer lớp trừu tượng, định nghĩa chế sở để trao đổi tin đối tượng dịch vụ đại diện chúng từ xa Lớp UnicastRemoteObject lớp RemoteServer HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán Object Remote RemoteObject RemoteStub RemoteServer UnicastRemoteObject Hình 4.1.1 Sơ đồ kế thừa đối tượng từ xa Lớp UnicastRemoteObject tạo đối tượng máy chủ Đây lớp sở để xây dựng lớp ứng dụng trao đổi thông tin từ xa máy chủ Ngồi ra, ta sử dụng lớp sở MulticastRemoteObject để kế thừa, tạo lớp ứng dụng chạy nhiều máy chủ đồng thời Lưu ý: Khi sử dụng RMI, vấn đề đặt tên cho lớp, giao diện cần phải cẩn trọng Để cho phù hợp, ta nên thực theo qui ước đặt tên sau: + Khơng có hậu tố, ví dụ: Product + Giao diện từ xa + Có hậu tố Impl, + Lớp cài đặt giao diện ví dụ: ProductImpl + Có hậu tố Server, ví dụ: ProductServer + Có hậu tố Client, ví dụ: ProductClient + Có hậu tố _Stub, ví dụ: ProductImpl_Stub + Có hậu tố _Skel, + Chương trình tạo đối tượng dịch vụ + Chương trình khách triệu gọi phương thức từ xa + Lớp đại diện máy khách tự động tạo chương trình rmic + Lớp đại diện máy chủ tự động tạo chương trình rmic ví dụ: ProductImpl_Skel Bởi đối tượng xuất thường gặp phải ngoại lệ java.rmi.RemoteException, nên ta phải định nghĩa toán tử tạo lập với mệnh đề throws RemoteException, chí tốn tử tạo lập khơng làm Nếu ta qun tốn tử tạo lập chương trình dịch javac thông báo lỗi 4.1.3 Cài đặt phương thức từ xa Lớp cài đặt đối tượng từ xa phải cài đặt tất phương thức khai báo giao diện từ xa HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán Các tham số, giá trị trả phương thức từ xa kiểu liệu Java, kể đối tượng Lưu ý: Một lớp định nghĩa phương thức khơng khai báo giao diện từ xa, gọi phương thức cục Những phương thức cục gọi ứng dụng (cùng JVM), khơng triệu gọi từ xa Sau hồn tất lớp cài đặt, ta cần tạo đại diện lớp ProductImpl để mã hoá tham số nhận lại kết lần triệu gọi phương thức từ xa Người lập trình khơng sử dụng lớp trực tiếp tự viết chúng Bộ công cụ rmic sinh chúng cách tự động, Ví dụ: C:\j2sdk1.4.0\bin>rmic ProductImpl Kết hai tệp lớp: ProductImpl_Stub.class ProductImpl_Skel.class sinh Đối với Java SDK tệp thứ hai khơng cịn cần thiết Nếu lớp đặt gói gọi rmic với tên gói 4.1.4 Xác định đối tượng dịch vụ Để truy cập đối tượng từ xa máy phục vụ, khách hàng cần có đối tượng đại diện nơi Khách yêu cầu đối tượng nào? Phương thức chung gọi phương thức từ xa đối tượng phục vụ tạo đối tượng đại diện để nhận kết trả lời Hệ thống RMI cung cấp đăng ký (RMI registry) đối tượng từ xa để ta kết hợp với tên thiết lập theo URL dạng “//host/objectname” giúp ta xác định đối tượng phục vụ Tên gọi dãy ký tự (xâu) xác định  static Remote lookup(String url) Tìm đến đối tượng từ xa theo địa url Nếu chưa có đối tượng đăng ký phát sinh ngoại lệ NotBoundException  static void bind(String name, Remote obj) Ghép (đóng gói) name với đối tượng từ xa obj Nếu đối tượng có gói phát sinh ngoại lệ AlreadyBoundException  static void unbind(String name) Mở để lấy name khỏi gói Nếu name khơng có gói phát sinh ngoại lệ NotBoundException  static void rebind(String name) Ghép (đóng gói) name với đối tượng từ xa obj Cho phép thay name đóng gói  static String[] list(String url) Lấy danh sách tên đối tượng (xâu) đăng ký địa url Chương trình khách truy cập đến đối tượng phục vụ cách tên dịch vụ tên đối tượng, sau ép kiểu giao diện từ xa sau: // Client Product p = (Product)Naming.lookup(“rmi://yourserver.com/teaster”); HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang Tiểu luận mơn học Lập trình mạng hệ phân tán Đối tượng p máy khách muốn triệu gọi phương thức từ xa đối tượng có tên đăng ký “teaster” máy phục vụ gọi hàm Naming.lookup() để truy tìm tham chiếu tới đối tượng từ xa RMIURL bắt đầu “rmi:/” sau Server, số hiệu cổng để lắng nghe (tuỳ chọn), dấu ‘/’ sau tên gọi đối tượng triệu gọi từ xa Ví dụ: rmi://localhost:99/teaster Số hiệu cổng mặc định 1099 4.1.5 Bộ đăng ký RMI registry Chương trình dịch vụ hoàn toàn chưa sẵn sàng thực Vấn đề cài đặt đối tượng ProductImpl máy máy khác (chương trình khác) muốn gọi phương thức getDescription() để biết thông tin mô tả giá bán sản phẩm có chương trình phục vụ Như nói trước, ta gọi trực tiếp ProductImpl trực tiếp mà thông qua lớp trung gian Stub Skel (không cần thiết Java SDK) Ta thực điều nhờ trình biên dịch rmic nêu Hơn nữa, máy khách muốn triệu gọi phương thức xa trước tiên phải liên lạc với đăng ký RMI registry máy xa Các hàm giao diện Java thực nhiệm vụ gọi hàm giao diện API JNDI Các hàm JNDI máy khách liên lạc với RMI registry máy chủ để nhận tham chiếu đối tượng hàm JNDI máy chủ lại có nhiệm vụ đăng ký tên đối tượng với RMI registry Để khởi động RMI registry Window 95 NT phải thực start rmiregistry [port] cửa sổ lệnh DOS Prompt hộp thoại Run, port số hiệu cổng giao diện để chờ phục vụ trả lời kết Và tất nhiên, thiết kế đối tượng RMI, cụ thể đối tượng cài đặt chi tiết máy phục vụ, ta phải ghi nhớ lấy số hiệu cổng cho khớp Nếu khơng định số hiệu cổng RMI registry ngầm định lắng nghe cổng 1099 Để khởi động registry cổng khác, phải số hiệu cổng dịng lệnh Ví dụ, đăng ký cổng 2001: start rmiregistry 2001 Một vấn đề khác đáng quan tâm RMI registry không cho phép đăng ký hai đối tượng tên Muốn chỉnh sửa lại hệ thống chương trình triệu gọi phương thức từ xa, ta phải, khởi động lại chương trình RMI Registry, từ đầu thiết kế chương trình Server đối tượng, ta sử dụng phương thức rebind() thay phương thức bind() để đăng ký với RMI registry máy phục vụ 4.1.6 Chi tiết RMI registry cách tự đăng ký đối tượng RMI registry đề cập dịch vụ tìm kiếm đối tượng Các đối tượng phục vụ muốn chương trình khách truy cập từ xa phải đăng ký với RMI registry Bộ đăng ký chương trình dịch vụ chạy hậu trường, lắng nghe cổng có số hiệu xác định Hiện Java yêu cầu máy ảo JVM chạy RMI registry máy JVM chạy chương trình Server (trên máy chủ) Một dịch vụ RMI registry tiếp nhận quản lý lúc nhiều đối tượng dịch vụ khác Java cho phép liên lạc với đăng ký RMI registry để lấy danh HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 10 Tiểu luận mơn học Lập trình mạng hệ phân tán { //System.out.println("vua set gia tri cua cong to su kien la: "+ctsk); this.congtosukienTToSX=ctsk; } public int getcongtosukienTT() { //System.out.println("vua get gia tri cua cong to su kien "+congtosukien); return this.congtosukienTToSX; } la: public void setcongtosukienSX(int ctsk) { //System.out.println("vua set gia tri cua cong to su kien la: "+ctsk); this.congtosukienSXoTT=ctsk; } public int getcongtosukienSX() { //System.out.println("vua get gia tri cua cong to su kien "+congtosukien); return this.congtosukienSXoTT; } // voi bien num public void setnum(int number) { // System.out.println("vua set gia tri cua cong to su kien la: "+ctsk); this.num=number; } public int getnum() { return this.num; } la: // voi bien mess public void setmess(java.lang.String message) { this.mess=message; } public java.lang.String getmess() { return this.mess; } // voi bien tong public int gettong() { return this.tong; } HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 27 Tiểu luận môn học Lập trình mạng hệ phân tán public void settong(int total) { this.tong=total; } // voi bien kiem tra public void setkiemtra(boolean kt) { this.kiemtra=kt; } public boolean getkiemtra() { return this.kiemtra; } } // Client1.java (chua cac lenh sau) import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import java.util.*; import java.rmi.*; import java.sql.*; import java.lang.*; import java.text.DateFormat; /** * A basic JFC 1.1 based application */ public class Client1 extends javax.swing.JFrame implements ActionListener { static Server1 sanxuat = null; static Server2 tieuthu =null; public Client1() { Unicode uni = new Unicode(); setTitle(uni.convert("Trat tu hoa tung phan")); setDefaultCloseOperation(javax.swing.JFrame.DO_NOTHING_ON_CLOSE); getContentPane().setLayout(new BorderLayout(0,0)); setSize(800,650); JPanel1.setLayout(null); getContentPane().add(JPanel1); JPanel1.setFont(new Font("Dialog", Font.BOLD, 12)); JPanel1.setBackground(java.awt.Color.pink); JPanel1.setForeground(java.awt.Color.pink); HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 28 Tiểu luận mơn học Lập trình mạng hệ phân tán JLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); JLabel1.setForeground(java.awt.Color.blue); JLabel1.setText(uni.convert("Mo^ pho?ng ddo^`ng bo^ ho'a ba(`ng phu+o+ng pha'p tra^.t tu+ tu+`ng pha^`n")); JPanel1.add(JLabel1); JLabel1.setFont(new Font("Dialog", Font.BOLD, 20)); JLabel1.setBounds(80,-3,624,48); cmdstart.setText(uni.convert("Kho+?i ddo^.ng ca'c server")); cmdstart.setActionCommand("jbutton"); JPanel1.add(cmdstart); cmdstart.setBounds(50,165,250,19); cmdstart.setBackground(java.awt.Color.orange); cmdSX.setText(uni.convert("Ki'ch hoa.t server sa?n xua^'t tru+o+'c")); cmdSX.setActionCommand("jbutton"); JPanel1.add(cmdSX); cmdSX.setBounds(50,195,250,19); cmdSX.setBackground(java.awt.Color.orange); cmdTT.setText(uni.convert("Ki'ch hoa.t server tie^u thu tru+o+'c")); cmdTT.setActionCommand("jbutton"); JPanel1.add(cmdTT); cmdTT.setBounds(50,225,250,19); cmdTT.setBackground(java.awt.Color.orange); cmdmoniter.setText(uni.convert("Ma`n hi`nh quan sa't hoa.t ddo^.ng")); cmdmoniter.setActionCommand("jbutton"); JPanel1.add(cmdmoniter); cmdmoniter.setBounds(50,255,250,19); cmdmoniter.setBackground(java.awt.Color.orange); cmdstop.setText(uni.convert("Ta.m du+`ng hoa.t ddo^.ng ca'c server")); cmdstop.setActionCommand("jbutton"); JPanel1.add(cmdstop); cmdstop.setBounds(50,285,250,19); cmdstop.setBackground(java.awt.Color.orange); thoat.setText("Thoat"); thoat.setActionCommand("jbutton"); JPanel1.add(thoat); thoat.setBounds(50,315,250,19); thoat.setBackground(java.awt.Color.orange); table1=new JTable(100,5); sp1=new JScrollPane(table1); HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 29 Tiểu luận mơn học Lập trình mạng hệ phân tán //table1.sizeColumnsToFit(5); table1.setBounds(350,105,400,375); JPanel1.add(table1); table1.setBackground(java.awt.Color.cyan); table1.setForeground(java.awt.Color.blue); table1.setValueAt("NP",0,0); table1.setValueAt("NC'",0,1); table1.setValueAt("NP'",0,2); table1.setValueAt("NC",0,3); table1.setValueAt("Tong tieu thu",0,4); SymWindow aSymWindow = new SymWindow(); this.addWindowListener(aSymWindow); SymAction lSymAction = new SymAction(); cmdstart.addActionListener(this); cmdTT.addActionListener(this); cmdSX.addActionListener(this); thoat.addActionListener(this); cmdstop.addActionListener(this); cmdmoniter.addActionListener(this); } public void thoat(){ try{ sanxuat.setmessSX("quit"); tieuthu.setmessTT("quit"); System.exit(0); }catch (Exception e){ System.out.println ("Client exception: " + e); } } public void cmdstart(){ try{ sanxuat.setmessSX("start"); tieuthu.setmessTT("start"); }catch (Exception e){ System.out.println ("Client exception: " + e); } } public void cmdSX(){ try{ sanxuat.setmessSX("tieuthu"); tieuthu.setmessTT("sanxuat"); System.out.println ("OKKKKKKKK "); }catch (Exception e){ System.out.println ("Client exception: " + e); } } HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 30 Tiểu luận môn học Lập trình mạng hệ phân tán public void cmdTT(){ try{ sanxuat.setmessSX("tieuthu"); tieuthu.setmessTT("sanxuat"); }catch (Exception e){ System.out.println ("Client exception: " + e); } } public void cmdstop(){ try{ sanxuat.setmessSX("Stop san xuat"); sanxuat.setcongtosukienSX(1); sanxuat.setnumSX(0); tieuthu.setmessTT("Stop tieu thu"); tieuthu.setcongtosukienTT(0); tieuthu.setnumTT(0); }catch (Exception e){ System.out.println ("Client exception: " + e); } } public void cmdmoniter(){ try{ MonitorTable MT= new MonitorTable(); }catch (Exception e){ System.out.println ("Monitoring exception: " + e); } } public void actionPerformed(ActionEvent e) { if (e.getSource()==thoat) thoat(); if (e.getSource()==cmdstart) cmdstart(); if (e.getSource()==cmdstop) cmdstop(); if (e.getSource()==cmdmoniter) cmdmoniter(); if (e.getSource()==cmdSX) cmdSX(); if (e.getSource()==cmdTT) cmdTT(); } static public void main(String args[]) { try { sanxuat = (Server1)Naming.lookup("rmi://localhost:1999/Server1"); tieuthu= (Server2)Naming.lookup("rmi://localhost:1099/Server2"); (new Client1()).setVisible(true); } catch (Throwable t) { t.printStackTrace(); HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 31 Tiểu luận mơn học Lập trình mạng hệ phân tán //Ensure the application exits with an error condition System.exit(1); } } //{{DECLARE_CONTROLS javax.swing.JPanel JPanel1 = new javax.swing.JPanel(); javax.swing.JLabel JLabel1 = new javax.swing.JLabel(); javax.swing.JButton cmdstart = new javax.swing.JButton(); javax.swing.JButton cmdTT = new javax.swing.JButton(); javax.swing.JButton cmdSX = new javax.swing.JButton(); javax.swing.JButton thoat = new javax.swing.JButton(); javax.swing.JButton cmdstop = new javax.swing.JButton(); javax.swing.JButton cmdmoniter = new javax.swing.JButton(); int i=0,k; JTable table=null; JScrollPane sp=null; JTable table1=null; DefaultTableModel tm= null; JScrollPane sp1=null; public Server1 remote; //public Server2 remote; void exitApplication() { try { // Beep Toolkit.getDefaultToolkit().beep(); // Show a confirmation dialog int reply = JOptionPane.showConfirmDialog(this, "Do you really want to exit?", "JFC Application - Exit" , JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); // If the confirmation was affirmative, handle exiting if (reply == JOptionPane.YES_OPTION) { this.setVisible(false); // hide the Frame this.dispose(); // free the system resources System.exit(0); // close the application } } catch (Exception e) { } } class SymWindow extends java.awt.event.WindowAdapter HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 32 Tiểu luận môn học Lập trình mạng hệ phân tán { public void windowClosing(java.awt.event.WindowEvent event) { Object object = event.getSource(); if (object == Client1.this) Client1_windowClosing(event); } } void Client1_windowClosing(java.awt.event.WindowEvent event) { // to do: code goes here Client1_windowClosing_Interaction1(event); } void event) { Client1_windowClosing_Interaction1(java.awt.event.WindowEvent try { this.exitApplication(); } catch (Exception e) { } } class SymAction implements java.awt.event.ActionListener { public void actionPerformed(java.awt.event.ActionEvent event) { } } void openItem_actionPerformed(java.awt.event.ActionEvent event) { // to do: code goes here openItem_actionPerformed_Interaction1(event); } void openItem_actionPerformed_Interaction1(java.awt.event.ActionEvent event) { try { // openFileDialog Show the FileDialog //openFileDialog.setVisible(true); } catch (Exception e) { } } HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 33 Tiểu luận mơn học Lập trình mạng hệ phân tán void saveItem_actionPerformed(java.awt.event.ActionEvent event) { // to do: code goes here saveItem_actionPerformed_Interaction1(event); } void saveItem_actionPerformed_Interaction1(java.awt.event.ActionEvent event) { try { // saveFileDialog Show the FileDialog //saveFileDialog.setVisible(true); } catch (Exception e) { } } void exitItem_actionPerformed(java.awt.event.ActionEvent event) { // to do: code goes here exitItem_actionPerformed_Interaction1(event); } void exitItem_actionPerformed_Interaction1(java.awt.event.ActionEvent event) { try { this.exitApplication(); } catch (Exception e) { } } void aboutItem_actionPerformed(java.awt.event.ActionEvent event) { // to do: code goes here aboutItem_actionPerformed_Interaction1(event); } void aboutItem_actionPerformed_Interaction1(java.awt.event.ActionEvent event) { try { // JAboutDialog Create with owner and show as modal { //JAboutDialog JAboutDialog1 = new JAboutDialog(this); //JAboutDialog1.setModal(true); //JAboutDialog1.show(); } } catch (Exception e) { } } } HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 34 Tiểu luận mơn học Lập trình mạng hệ phân tán // MonitorTable.java (chua cac lenh sau) dung de display cac gia tri theo dõi chúng import java.io.*; import java.awt.Component; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.rmi.*; public class MonitorTable extends JFrame { static DefaultTableModel dm; static JTable table; static JScrollPane scroll; // khai bao cac doi tuong tu xa static Server1 sanxuat = null; static Server2 tieuthu =null; MonitorTable() { super("Monitoring Server San xuat, Tieu thu"); dm = new DefaultTableModel() { public Class getColumnClass(int columnIndex) { return String.class; } }; table = new JTable(dm); int lines = 2; table.setRowHeight(table.getRowHeight() * lines); scroll = new JScrollPane(table); getContentPane().add(scroll); setSize(800,430); setVisible(true); } public static void viewTable(){ try{ //khoi tao cac doi tuong tu xa sanxuat = (Server1)Naming.lookup("rmi://localhost:1999/Server1"); tieuthu = (Server2)Naming.lookup("rmi://localhost:1099/Server2"); //khai bao cho table Object[] col =new Object[6]; col[0]="CTSK o TSX (NP)"; col[1]="CTSK o TTT (NC')"; HVTH: Nguyễn Anh Tuấn – Nguyễn Năng Hùng Vân Trang 35 Tiểu luận mơn học Lập trình mạng hệ phân tán col[2]="Tram San Xuat gui gia tri"; col[3]="CTSK o TTT (NC)"; col[4]="CTSK o TSX (NP')"; col[5]="Gia tri Tram Tieu Thu da xu ly"; int i,k; for (k=0;k

Ngày đăng: 12/11/2014, 08:51

Từ khóa liên quan

Mục lục

  • LỜI NÓI ĐẦU

  • PHẦN I : CƠ SỞ LÝ THUYẾT

  • LẬP TRÌNH MẠNG PHÂN TÁN VÀ RMI

    • 1. Mạng máy tính Phân tán.

    • 2. Các điểm mạnh trong hệ tin học phân tán.

    • 3. Giới thiệu phương thức triệu gọi đối tượng từ xa RMI(Remote Method Invocation).

      • 3.1. Triệu gọi phương thức từ xa.

      • 3.2. Kiến trúc RMI Java.

      • 4. Thiết lập môi trường triệu gọi từ xa.

        • 4.1. Trên máy phục vụ (Server).

          • 4.1.1. Thiết lập giao diện từ xa.

          • 4.1.2. Xây dựng các lớp cài đặt các giao diện từ xa

          • 4.1.3. Cài đặt các phương thức từ xa

          • 4.1.4. Xác định các đối tượng dịch vụ.

          • 4.1.5. Bộ đăng ký RMI registry.

          • 4.1.6. Chi tiết về RMI registry và các cách tự đăng ký đối tượng.

          • 4.2 Trên máy khách (Client).

          • 5. Nhận xét về phương thức lập trình phân tán RMI.

          • PHẦN 2: BÀI TẬP

            • 2. Hướng Giải quyết bài toán

              • NP = NP + 1

              • Kết thúc vòng lặp

              • 3. Chương trình và kết quả demo.

                • 3.1. Nội dung chương trình.

                • 3.2. Kết quả chạy chương trình

                • TÀI LIỆU THAM KHẢO

                • MỤC LỤC

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

Tài liệu liên quan