Giáo trình Lập trình mạng (Phần 2)
Tóm tắt Giáo trình Lập trình mạng (Phần 2): ...chia phần mềm trờn mỗi thiết bị ra làm hai thành phần logic tương ứng với mỗi kờnh. Thành phần Protocol Interpreter (PI) là thành phần quản lý kờnh ủiều khiển, với chức năng phỏt và nhận lệnh. Thành phần Data Transfer Process (DTP) cú chức năng gửi và nhận dữ liệu giữa phớa client với server. ...teLine(request); break; } case "PASS": { sw.WriteLine("230. Dang nhap thanh cong"); sw.Flush(); Console.WriteLine(request); break; } 85 case "MKD": { string folderName = request.Substring(4, request.Length - 4); folderName = rootDir + "/" + folderName.Trim(); t...so * ps1.th_ps.mauso; kq.th_ps.mauso = ps1.th_ps.mauso * ps2.th_ps.mauso; return kq; } Cài ủặt hàm cập nhật từ ủối tượng xử lý phõn số khỏc public void CapNhat(XL_PHANSO ps) { this.th_ps.tuso = ps.th_ps.tuso; this.th_ps.mauso = ps.th_ps.mauso; } Cài ủặt hàm rỳt gọn phõn số ...
i ra, TcpChannel và HttpChannel đều cĩ khả năng extend thành những Custom Channel của bạn. Làm sao để tạo một Object cĩ thể Remote được trong .NET Remoting? - Một Object remote được chỉ là một object thơng thường nhưng phải được inherit từ MarshalByRefObject. ðoạn code sample ở hình 4.2 là một ví dụ đơn giản về Remotable Object. ðối tượng SampleObject trong hình cĩ một số method đơn giản trả về phép tính tổng, hiệu, tích, thương của hai số nguyên. Giá trị trả về của hàm là kiểu số nguyên, kiểu built-in của .NET framework. Nếu bạn muốn trả về kiểu dữ liệu bạn tự định nghĩa, hoặc một instance của class bạn định nghĩa thì lớp đĩ của bạn phải được khai báo với attribute Serializable. using System; public class SampleObject: MarshalByRefObject { public int Add(int a, int b) { int c = a + b; 104 return c; } public int Subtract(int a, int b) { int c = a - b; return c; } public int Multiply(int a, int b) { int c = a * b; return c; } public int Divide(int a, int b) { int c; if (b != 0) c = a / b; else c = 0; return c; } } Hình 4.2: Remotable Object Sample Tạo chương trình Server để host Remotable Object - Kế tiếp, chúng ta cần tạo ra một chương trình server để lắng nghe những request từ phía client. Trong ví dụ này chúng ta sẽ sử dụng TCP/IP channel. ðầu tiên chúng ta tạo một instance channel và đăng kí một port tương ứng cho nĩ. Khi cĩ một Request từ phía client, server sẽ nhận request đĩ và Remote Object của chúng ta sẽ thực thi Request này. Trong .NET Remoting, cĩ hai cơ chế để tạo instance của Remote Object rồi từ đĩ thực thi request: Singleton và Singlecall. Tùy vào mục đích sử dụng, nhu cầu của chương trình mà server của bạn cĩ thể khai báo theo cơ chế WellKnownObjectMode.SingleCall, hay WellKnownObjectMode.Singleton. Khi khai báo Singleton, Remote Object sẽ được sinh ra, thực thi request, reply lại phía client và sau đĩ, object này vẫn được lưu lại chứ khơng bị hủy đi. ðến khi nào process chạy chương trình server kết thúc thì instance này mới bị trình hốt rác Garbage Collector hốt đi. Và ngược lại, khi khai báo là SingleCall, Remote Object sẽ được khởi tạo và hủy đi đối với mỗi lần nhận request từ phía client, cơ chế này tương tự như mơ hình .NET Web Service truyền thống. - Nếu bạn muốn sử dụng .NET Remoting trong IIS thì khơng cần tạo một chương trình server như thế này. Và tất nhiên, IIS chỉ hỗ trợ HttpChannel. Nếu host 1 .NET Remoting bên trong IIS bạn sẽ mặc nhiên sử dụng được cơ chế Authentication của IIS, ngược lại nếu làm một chương trình server để host như trên thì bạn phải cài đặt cơ chế Authentication của riêng mình. ðể host một Remote Object bên trong IIS, trước tiên phải tạo 1 Virtual Directory cho application, sau đĩ đặt đoạn code đăng kí service bên trong event Application_Start (file global.asax) 105 - Trong ví dụ này, chúng ta sẽ khơng sử dụng IIS mà sẽ tạo một console application. Cĩ nhiều lựa chọn khi khơng sử dụng IIS, ta cĩ thể sử dụng console application, Win form application nhưng trong thực tế, người ta sẽ sử dụng một Windows Service để làm. Cịn Console application hay Winform Application thường chỉ dùng để minh họa. Trong ví dụ này, chúng ta sẽ sử dụng port 9999 cho may mắn. Cĩ thể một chương trình nào đĩ trong máy của bạn đã sử dụng port này, nếu bị như vậy bạn phải chọn port khác. Và sau cùng, để kiểm tra xem máy bạn đang lắng nghe trên những port nào (port nào đã bị sử dụng) thì ta dùng lệnh “netstat –a” trong command prompt. - Cịn bây giờ, hãy xem một console application project với 1 class tên là SampleSerrver. Trong project này tơi đã thêm reference tới System.Runtime.Remoting vào trong project để nĩ cĩ thể chạy được. using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Server { public static int Main() { TcpChannel chan = new TcpChannel(9999); ChannelServices.RegisterChannel(chan, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SampleObject) , "SampleNetRemoting", WellKnownObjectMode.SingleCall); Console.WriteLine("Hit to exit..."); Console.ReadLine(); } } Hình 4. 3: Sample Server host Remotable Object Tạo chương trình client để sử dụng Remote Object. - Chương trình client trong ví dụ này cũng khá đơn giản, nĩ sẽ connect vào server, tạo một instance của Remote Object và excute method tính tổng, hiệu, tích, thương. - Các bạn lưu ý rằng trong cả chương trình client và chương trình server đều phải reference tới class SampleObject. Client sẽ gọi method của instance SampleObject, nhưng server sẽ thực thi xử lý nĩ chứ khơng phải phía client. using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Http; public class Client { 106 public static int Main (string[] argv) { TcpChannel chan = new TcpChannel(); ChannelServices.RegisterChannel(chan, false); SampleObject obj = (SampleObject)Activator.GetObject( typeof(SampleObject), "tcp://localhost:9999/SampleNetRemoting"); if (obj == null) System.Console.WriteLine("Could not locate server"); else { int a = Convert.ToInt32(argv[0]); int b = Convert.ToInt32(argv[1]); int c = obj.Add(a, b); Console.WriteLine("a + b = {0}", c); c = obj.Subtract(a, b); Console.WriteLine("a - b = {0}", c); c = obj.Multiply(a, b); Console.WriteLine("a * b = {0}", c); c = obj.Divide(a, b); Console.WriteLine("a / b = {0}", c); } Console.ReadKey(); } } Hình 4: Sample Client Application Test thử chương trình - Trước tiên chạy chương trình server, bạn sẽ thấy message “Press the enter key to exit” trong cửa sổ console. Như vậy server của bạn đang lắng nghe trên port 9999. Bây giờ bạn hãy chạy chương trình client và sẽ nhìn thấy kết quả trả về trên màn hình. Bạn cĩ thể chạy nhiều client để cùng request đến 1 server nhưng khơng thể chạy nhiều server. Bạn cĩ thể copy chương trình server sang một máy của bạn mình và nhờ chạy thử, cịn bạn sửa lại chương trình client, sửa “localhost” thành IP của máy bạn mình và chạy thử để thấy kết quả. Tĩm tắt: - Ví dụ ở trên đã sử dụng code C# để khai báo các cấu hình cho server và client tuy nhiên .NET Remoting cho phép ta cấu hình trước trong file config (App.config). Các bạn cĩ thể tham khảo một số resource phía dưới để biết cách làm. - .NET Remoting là một trong những kĩ thuật tiện lợi cho những chương trình dạng Distributed Computing. Cách sử dụng nĩ phức tạp hơn Web Service tuy nhiên nếu bạn 107 muốn tăng performance thì .NET Remoting với Singleton và TCP channel sẽ là lựa chọn rất tốt. - Với sự ra đời của .NET Framework 3.x, Microsoft đã giới thiệu nền tảng mới hơn cho các kĩ thuật RPC, đĩ là WCF mạnh hơn .NET Remoting rất nhiều. 4.2.2. Khai báo, cài đặt và đăng ký giao diện từ xa ðể cho chương trình cĩ tính khả chuyển cao thay vì người ta xây dựng lớp Remote Object như ví dụ trên chúng ta khai báo một giao diện là lớp Remote Object và trong chương trình phía Server ta sẽ cài đặt giao diện này và đăng ký giao diện từ xa. Như vậy để triển khai một hệ thống Remoting ta cĩ 3 chương trình: Giao diện Remote Object, chương trình Server triển khai giao diện và đăng ký giao diện từ xa, chương trình Client triệu gọi phương thức từ xa. - Khai báo giao diện từ xa - Cài đặt và đăng ký giao diện từ xa 4.2.3. Triệu gọi phương thức từ xa - Chương trình phía Client chúng ta triệu gọi phương thức được cung cấp bởi giao diện tử xa đã được đăng ký và cung cấp bởi Server 4.3. Web Services 4.3.1. Giới thiệu về Web Services 1. Web Service là gì? Web service là một Modul chương trình cung cấp chức năng của các ứng dụng cho phép triệu gọi và truy cập từ xa thơng qua Internet. Web service sử dụng các chuẩn của Internet như XML và HTTP. Việc sử dụng Web service phụ thuộc nhiều vào sự chấp nhận của XML, một ngơn ngữ mơ tả dữ liệu mới dùng để truyền tải dữ liệu thơng qua Web. Bất kỳ một Web service nào cũng cĩ thể được sử dụng, hoặc là trong ứng dụng cục bộ hoặc truy cập từ xa qua Internet bởi nhiều ứng dụng. Do cĩ khả năng truy cập qua các giao diện chuẩn mà một Web service cho phép nhiều hệ thống khác nhau cùng làm việc với nhau như một tiến trình duy nhất trên Web. 2. Vai trị của Web service Web service ra đời đã mở ra một hướng mới cho việc phát triển các ứng dụng trên Internet. Web services tạm dịch là các dịch vụ trên web. Cơng nghệ web services ra đời là một cuộc cách mạng hĩa cách thức hoạt động của các dịch vụ B2B và B2C. Web services kết hợp sử dụng nhiều cơng nghệ khác nhau cho phép hai ứng dụng cùng ngơn ngữ, độc lập hệ điều hành trao đổi được với nhau thơng qua mơi trường mạng Internet. Tuy nhiên những cơng nghệ sử dụng ở đây khơng nhất thiết phải là những cơng nghệ mới. ðây là điểm khác biệt của web services so với các cơng nghệ khác, đĩ chính là khả năng kết hợp các cơng nghệ đã cĩ như là XML, SOAP, WSDL, UDDI để tạo ra các service, đặc điểm này làm nổi bật vai trị của web services. 108 Web Service được thiết kế nhằm cung cấp một cơ chế cho phép các chương trình giao tiếp với nhau qua Internet (sử dụng các giao thức Internet như HTTP GET, HTP POST và SOAP). 3. ðặc điểm Web service - Web service cho phép client và server tương tác được với nhau mặc dù trong những mơi trường khác nhau. - Web Service thì cĩ dạng mở và dựa vào các tiêu chuẩn XML và HTTP là nền tảng kỹ thuật cho web service. Phần lớn kỹ thuật của web service được xây dựng là những dự án nguồn mở. Bởi vậy chúng độc lập và vận hành được với nhau. - Web Service thì rất linh động: Vì với UDDI và WSDL, thì việc mơ tả và phát triển web service cĩ thể được tự động hố. - Web service được xây dựng trên nền tảng những cơng nghệ đã được chấp nhận. - Web service cĩ dạng modul. - Web service cĩ thể được cơng bố (publish) và gọi thực hiện qua mạng. Ngày nay web service được sử dụng rất nhiều trong những lĩnh vực khác nhau của cuộc sống như: - Dịch vụ chọn lọc và phân loại tin tức: là những hệ thống thư viện kết nối đến các web portal để tìm kiếm các thơng tin từ các nhà xuất bản cĩ chứa những khố muốn tìm. - Dịch vụ hiển thị danh sách đĩa nhạc dành cho các cơng ty thu thanh. - Ứng dụng đại lý du lịch cĩ nhiều giá vé đi du lịch khác nhau do cĩ chọn lựa phục vụ của nhiều hãng hàng khơng. - Bảng tính tốn chính sách bảo hiểm dùng cơng nghệ Excel/COM với giao diện web. - Thơng tin thương mại bao gồm nhiều nội dung, nhiều mục tin như: dự báo thời tiết, thơng tin sức khoẻ, lịch bay, tỷ giá cổ phiếu, - Những giao dịch trục tuyến cho cả B2B và B2C như: đặt vé máy bay, làm giao kèo thuê xe. - Hệ thống thơng tin dùng java để tính tốn tỷ giá chuyển đổi giữa các loại tiền tệ. Hệ thống này sẽ được các ứng dụng khác dùng như một web service. 4. Kiến trúc Web service Kiến trúc của Web service bao gồm các tầng như sau: 109 Hình 1: Kiến trúc Web service Trong đĩ bao gồm các tầng như sau: - Tầng vận chuyển: cĩ nhiệm vụ truyền thơng điệp giữa các ứng dụng mạng, bao gồm những giao thức như HTTP, SMTP, FTP, JSM và gần đây nhất là giao thức thay đổi khổi mở rộng (Blocks Extensible Exchange Protocol- BEEP). - Tầng giao thức tương tác dịch vụ ( Service Communication Protocol) với cơng nghệ chuẩn là SOAP. SOAP là giao thức nằm giữa tầng vận chuyển và tầng mơ tả thơng tin về dịch vụ, SOAP cho phép người dùng triệu gọi một service từ xa thơng qua một message XML. - Tầng mơ tả dịch vụ (Service Description) với cơng nghệ chuẩn là WSDL và XML. WSDL là một ngơn ngữ mơ tả giao tiếp và thực thi dựa trên XML. Web service sử dụng ngơn ngữ WSDL để truyền các tham số và các loại dữ liệu cho các thao tác, các chức năng mà web service cung cấp. - Tầng dịch vụ ( Service): cung cấp các chức năng của service. - Tầng đăng ký dịch vụ (Service Registry) với cơng nghệ chuẩn là UDDI. UDDI dùng cho cả người dùng và SOAP server, nĩ cho phép đăng ký dịch vụ để người dùng cĩ thể gọi thực hiện service từ xa qua mạng, hay nĩi cách khác một service cần phải được đăng ký để cho phép các client cĩ thể gọi thực hiện - Bên cạnh đĩ để cho các service cĩ tính an tồn, tồn vẹn và bảo mật thơng tin trong kiến trúc web service chúng ta cĩ thêm các tầng Policy, Security, Transaction, Management giúp tăng cường tính bảo mật, an tồn và tồn vẹn thơng tin khi sử dụng service. 4.3.2. Giao thức SOAP 110 SOAP là chữ viết tắt của cụm từ “Simple Object Access Protocol – Giao thức truy cập đối tượng đơn giản”, nhưng với sự xem xét mới nhất thì, SOAP sẽ khơng cịn là một từ viết tắt nữa. Chuẩn SOAP ghi nhận XML được thể hiện thế nào bên trong tài liệu SOAP, làm thế nào nội dung của thơng điệp được truyền tải, và làm thế nào thơng điệp được xử lý ở cả hai phía gởi và nhận. SOAP cũng cung cấp một tập các từ vựng chuẩn. Các thuật ngữ: Như bẩt kỳ cơng nghệ nào, SOAP cũng cĩ tập các thuật ngữ của riêng nĩ. Cĩ nhiều thuật ngữ được sử dụng thường xuyên để mơ tả các khía cạnh khác nhau của chuẩn SOAP. Nhiều lập trình viên dùng các thuật ngữ này mà khơng thật sự hiểu ý nghĩa của nĩ. ðể hiểu thật sự các khái niệm địi hỏi phải tốn một thời gian để hiểu ý nghĩa của từng thuật ngữ và làm thế nào để áp dụng cho cả chuẩn SOAP và một Web Services thực thụ Chú ý: Chuẩn SOAP khơng chỉ là chuẩn XML mà chuẩn này cịn bao gồm các thơng điệp SOAP cĩ hành vi như thế nào, các phương tiện vận chuyển khác nhau, cách mà các lỗi được xử lý.. Sự truyền tải dữ liệu SOAP Binding Thuật ngữ mơ tả làm thế nào một thơng điệp SOAP tương tác được với một giao thức vận chuyển như HTTP, SMTP hay FTP để di chuyển trên Internet. ðiều quan trọng là SOAP di chuyển bằng một giao thức chuẩn để liên lạc với các sản phẩm Web Services khác. Trước SOAP, nhiều người phát triển đã tạo ra các phương pháp của riêng họ để chuyển tải một tài liệu XML trên mạng. Các cách này vẫn hoạt động tốt trong phạm vi một nhĩm cụ thể. Tuy nhiên khi bạn cần làm việc với một nhĩm khác ở trong hay bên ngồi cơng ty thì điều này trở nên khĩ khăn vì phải huấn luyện và cĩ thể thay đổi để làm việc với việc truyền tải tài liệu XML mà họ đang sử dụng. Bằng cách sử dụng một tài liệu XML chuẩn trên các giao thức chuẩn, cơng việc cần làm khi cộng tác với nhau sẽ được giảm thiểu tối đa SOAP Message Exchang Pattern (MEP) Thuật ngữ mơ tả làm thế nào mà một tài liệu SOAP trao đổi giữa phía máy khách và chủ. Thơng điệp SOAP sở hữu một liên kết, như là HTTP, để nĩ cĩ thể truyền trên Internet. Việc nĩi chuyện giữa máy khách và chủ, ở đây là các nút, xác định các hành động mà cả hai phía thực hiện. Nhắc lại SOAP là một XML đĩng gĩi RPC. Vì thế, MEP hồn tồn là yêu cầu và phản hồi giữa máy khách và chủ (hay các nút khác). Như vậy nếu cĩ nhu cầu liên lạc giữa các nút thì việc này được thực hiện bằng nhiều yêu cầu và phản hồi để hồn tất việc truyền thơng điệp. Cách này khác hẳn với các cơng nghệ đối tượng từ xa khác như CORBA, cơng nghệ đĩ được thực hiện chỉ trong một kết nối. SOAP Application Một ứng dụng SOAP đơn giản là một ứng dụng dùng SOAP theo một vài cách khác nhau. Vài ứng dụng hồn tồn dựa trên chuẩn SOAP, như là Web Services cổ phiếu, hoặc dùng chuẩn SOAP để nhận mã và các cập nhật của phần mềm. Chú ý là một ứng dụng cĩ thể tạo, sử dụng hoặc là nút trung gian của Web Services. SOAP Node Trách nhiệm của một nút cĩ thể bao gồm gởi, nhận, xử lý hoặc truyền tải lại một thơng điệp SOAP. Một nút chỉ là một phần nhỏ của phần mềm, xử lý một tài liệu SOAP phụ thuộc vào 111 vai trị của nĩ. Bên cạnh việc truyền dữ liệu, một nút cĩ trách nhiệm đảm bảo thơng tin XML trong tài liệu SOAP phải đúng ngữ pháp theo chuẩn SOAP. SOAP Role Một vai trị của SOAP định nghĩa một nút cụ thể hoạt động như thế nào. Nĩ cĩ thể là nút gởi, nhận hoặc nút trung gian. SOAP Sender Nút gởi là nút gởi yêu cầu SOAP. Nếu bạn nghĩ đến ví dụ của ứng dụng khách chủ thì khi ứng dụng khách thực hiện yêu cầu, nĩ gởi thơng điệp tới ứng dụng chủ để yêu cầu vài thơng tin. SOAP Receiver Ngược lại với SOAP sender là nút nhận. SOAP Intermediary Một nút trung gian cĩ thể xem một thơng điệp SOAP và tương tác trên vài phần thơng tin của thơng điệp, và chuyển đến vị trí kế tiếp của thơng điệp. Một nút trung gian thường hoạt động như một router. Một router sẽ xem xét thơng tin của gĩi tin chuyển trên mạng, tìm điểm kế tiếp của gĩi tin và chuyển gĩi tin đển đĩ. Message Path Một thơng điệp SOAP di chuyển từ phía bên gởi đến phía bên nhận thơng điệp thơng qua nhiều nút trung gian. Tuyến đường đi của thơng điệp được gọi là một Message Path. Initial SOAP Sender Nút gởi yêu cầu SOAP đầu tiên là nút gởi SOAP ban đầu. SOAP Feature Một đặc điểm SOAP là một phần chức năng của phần mềm hỗ trợ chức năng SOAP. Các thuật ngữ liên quan đến XML Chuẩn SOAP cũng định nghĩa một tập nhỏ các phần tử XML để đĩng gĩi dữ liệu được truyền giữa các nút. Thật sự chỉ cĩ vài phần tử vì phần thân của thơng điệp cĩ thể khác nhau phụ thuộc vào cài đặt. Sự uyển chuyển này được cho phép bởi chuẩn SOAP. SOAP Message ðây là tài liệu XML được truyền bởi một nút SOAP gởi hoặc nhận. Một nút gởi hoặc nút khách tạo ra một tài liệu XML chứa thơng tin mà phía bên khách cần từ phía chủ. Một khi tài liệu được truyền, phía bên chủ phân giải thơng tin trong tài liệu để truy xuất các giá trị khác nhau và tạo một thơng điệp SOAP mới để phản hồi. SOAP Envelope ðây là phần tử gốc của tài liệu SOAP XML. Tài liệu SOAP chứa nhiều định nghĩa khơng gian tên (namespace) nhưng các phần tử liên quan tới thơng điệp SOAP sẽ cĩ ENV: là tiếp đầu ngữ. SOAP Header 112 Phần đầu của một thơng điệp SOAP chứa một khối thơng tin đầu trong tài liệu XML để định tuyến và xử lý thơng điệp SOAP. Dữ liệu này tách rời khỏi phần thân của tài liệu cĩ chứa thơng tin liên quan đến đối tượng được gọi. SOAP Header Block Phần đầu của SOAP chứa nhiều phần giới hạn hay là nhiều khối thơng tin cĩ một khối thơng tin của phần đầu. Những khối thơng tin của phần đầu này chứa thơng tin về các nút trung gian vì một nút cần biết nút kế tiếp để thơng điệp được gởi đến. SOAP Body Phần thân của SOAP thật sự chứa thơng tin của đối tượng để xử lý thơng tin. Phần thân sau khi được phân tách sẽ trở thành đối tượng. ðối tượng xử lý thơng tin và kết quả được đặt trong phần thân của tài liệu trả về. SOAP Fault ðây là một phần thơng tin của SOAP chứa thơng tin đến bất kỳ lỗi gì xảy ra tại một nút SOAP. 4.3.3. Xây dựng Web Services - Tạo một Web Services project - Tạo Web Method 113 - Chạy thử Web Services danh sách các hàm sẽ được liệt kê - Chọn hàm Add 114 - Sau khi nhập các tham số vào, nhấn Invoke. Kết quả sẽ xuất hiện 4.3.4. Triệu gọi Web Services từ ứng dụng .NET, Java và các ngơn ngữ khác - Sau khi xây dựng Web Server song ta cĩ thể triệu gọi nĩ từ một ứng dụng khác - Tạo một Window Form 115 - Add Web Reference - Tạo màn hình: 116 - Viết hàm xử lý nút nhấn: - Chạy thử ứng dụng ta cĩ kết quả: 4.4 Thảo luận về các ứng dụng phân tán 4.5. Bài tập áp dụng 1. Viết chương trình Chat sử dụng cơng nghệ Web Services 2. Viết chương trình Calculator bằng cơng nghệ Web Services 3. Viết chường trình quản lý FileManager bằng cơng nghệ Web Services. 117 TÀI LIỆU THAM KHẢO 1. Richard Blum, C# Network Programming, 2003 2. Fiach Reid, Network programming in NET with C# and VB.NET, Digital Press, 2003 3. Bài giảng “Nhập mơn Cơng nghệ phần mềm”, ðại học KHTN 4. Bài giảng “Xây dựng phần mềm hướng đối tượng”, ðại học KHTN 5. Bài giảng “Lập trình truyền thơng”, ðại học Cần Thơ 6. Bài giảng “Cơng nghệ .NET”, Khoa CNTT – ðại học SPKT Hưng Yên 7. Bài giảng “Java Nâng cao”, Khoa CNTT- ðại học SPKT Hưng Yên 8. Các ví dụ tại Website: www.java2s.com
File đính kèm:
- giao_trinh_lap_trinh_mang_phan_2.pdf