Giáo trình Lập trình mạng với C#

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.

pdf117 trang | Chia sẻ: hachi492 | Ngày: 07/01/2022 | Lượt xem: 417 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình Lập trình mạng với C#, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nh PORT. Và tại sao ñiều này lại ñược thực hiện? Vì theo luật TCP: sau khi một kết nối ñược ñóng lại , có một khoảng thời gian trống trước khi cổng ñó có thể ñược sử dụng lại – ñiều này ñể ngăn ngừa tình trạng các phiên kết nối liên tiếp bị lẫn với nhau. ðiều này sẽ tạo ra ñộ trễ khi gửi nhiều file – do ñó phía client thường dùng các giá trị cổng khác nhau cho mỗi kết nối. ðiều này rất hiệu quả nhưng cũng dẫn tới việc firewall của client sẽ hỏi có chấp nhận phiên kết nối tới với nhiều giá trị cổng không ổn ñịnh hay không. Việc dùng kết nối kiểu kênh gián tiếp sẽ giảm thiểu vấn ñề này một cách hiệu quả. Phần lớn các tường lửa có nhiều vấn ñề liên quan tới kết nối hướng về với các giá trị cổng bất kỳ, hơn là gặp vấn ñề với các kết nối hướng ñi. Ta có thể xem chi tiết hơn về vấn ñề này trong chuẩn RFC 1579. Chuẩn này khuyến nghị rằng phía client nên sử dụng kết nối kiểu bị ñộng làm dạng mặc ñịnh thay vì sử dụng kiểu kết nối dạng chủ ñộng cùng với lệnh PORT, ñể ngăn chặn tình trạng block theo cổng. Tất nhiên, phương thức kết nối kiểu bị ñộng không hoàn toàn giải quyết ñược vấn ñề, chúng chỉ ñẩy vấn ñề về phía server mà thôi. Phía server, giờ ñây phải ñối mặt với việc có nhiều kênh kết nối hướng về trên hàng loạt các cổng khác nhau. Tuy nhiên việc xử lý các vấn ñề bảo mật trên một nhóm nhỏ server vẫn dễ hơn nhiều so với việc phải ñối mặt với một lượng lớn các vấn ñề từ nhiều client. FTP server phải ñược cấu hình chấp nhận phương thức truyền bị ñộng từ client, do ñó cách thông thường ñể thiết lập trên server là thiết lập chấp nhận một số cổng kết nối hướng về trên server trong khi vẫn khóa các yêu cầu kết nối hướng về trên các cổng khác. 4 - Các phương thức truyền dữ liệu trong FTP Khi kênh dữ liệu ñã ñược thiết lập xong giữa Server-DTP với User-DTP, dữ liệu sẽ ñược truyền trực tiếp từ phía client tới phía server, hoặc ngược lại, dựa theo các lệnh 83 ñược sử dụng. Do thông tin ñiều khiển ñược gửi ñi trên kênh ñiều khiển, nên toàn bộ kênh dữ liệu có thể ñược sử dụng ñể truyền dữ liệu. (Tất nhiên, hai kênh logic này ñược kết hợp với nhau ở lớp dưới cùng với tất cả các kết nối TCP/UDP khác giữa hai thiết bị, do ñó ñiều này không hẳn ñã cải thiện tốc ñộ truyền dữ liệu so với khi truyền trên chỉ một kênh – nó chỉ làm cho hai việc truyền dữ liệu và ñiều khiển trở nên ñộc lập với nhau mà thôi) FTP có ba phương thức truyền dữ liệu, nêu lên cách mà dữ liệu ñược truyền từ một thiết bị tới thiết bị khác trên một kênh dữ liệu ñã ñược khởi tạo, ñó là: stream mode, block mode, và compressed mode Stream mode Trong phương thức này, dữ liệu ñược truyền ñi dưới dạng các byte không cấu trúc liên tiếp. Thiết bị gửi chỉ ñơn thuần ñầy luồng dữ liệu qua kết nối TCP tới phía nhận. Không có một trường tiêu ñề nhất ñịnh ñược sử dụng trong phương thức này làm cho nó khá khác so với nhiều giao thức gửi dữ liệu rời rạc khác. Phương thức này chủ yếu dựa vào tính tin cậy trong truyền dữ liệu của TCP. Do nó không có cầu trúc dạng header, nên việc báo hiệu kết thúc file sẽ ñơn giản ñược thực hiện việc phía thiết bị gửi ngắt kênh kết nối dữ liệu khi ñã truyền xong. Trong số ba phương thưc, stream mode là phương thức ñược sử dụng nhiều nhất trong triển khai FTP thực tế. Có một số lý do giải thích ñiều ñó. Trước hết, nó là phương thức mặc ñịnh và ñơn giản nhất, do ñó việc triển khai nó là dễ dàng nhất. Thứ hai, nó là phương pháp phổ biến nhất, vì nó xử lý với các file ñều ñơn thuần như là xử lý dòng byte, mà không ñể ý tới nội dung của các file. Thứ ba, nó là phương thức hiệu quả nhất vì nó không tốn một lượng byte “overload” ñể thông báo header. Block mode ðây là phương thức truyền dữ liệu mang tính quy chuẩn hơn, với việc dữ liệu ñược chia thành nhiều khối nhỏ và ñược ñóng gói thành các FTP blocks. Mỗi block này có một trường header 3 byte báo hiệu ñộ dài, và chứa thông tin về các khối dữ liệu ñang ñược gửi. Một thuật toán ñặc biệt ñược sử dụng ñể kiểm tra các dữ liệu ñã ñược truyền ñi và ñể phát hiện, khởi tạo lại ñối với một phiên truyền dữ liệu ñã bị ngắt. Compressed mode ðây là một phương thức truyền sử dụng một kỹ thuật nén khá ñơn giản, là “run-length encoding” – có tác dụng phát hiện và xử lý các ñoạn lặp trong dữ liệu ñược truyền ñi 84 ñể giảm chiều dài của toàn bộ thông ñiệp. Thông tin khi ñã ñược nén, sẽ ñược xử lý như trong block mode, với trường header. Trong thực tế, việc nến dữ liệu thường ñược sử dụng ở những chỗ khác, làm cho phương thức truyền kiểu compressed mode trở nên không cần thiết nữa. Ví dụ: nếu bạn ñang truyền ñi một file qua internet với modem tương tự, modem của bạn thông thường sẽ thực hiện việc nén ở lớp 1; các file lớn trên FTP server cũng thường ñược nén sẵn với một số ñịnh dạng như ZIP, làm cho việc nén tiếp tục khi truyền dữ liệu trở nên không cần thiết. 3.4.2. Cài ñặt FTP Client/Server Trên cơ sở giao thức FTP chúng ta thực hiện cài ñặt FTP Client/Server ñể minh họa cho giao thức Chương trình Simple FTP Server: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; class Program { static void Main(string[] args) { string rootDir = "C:/MyFTP"; IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2121); TcpListener server = new TcpListener(iep); server.Start(); TcpClient client = server.AcceptTcpClient(); StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); sw.WriteLine("220 Chao mung ket noi toi MyFTP"); sw.Flush(); while (true) { string request = sr.ReadLine(); string command=""; if(request.Length!=0) command = request.Substring(0, 4); switch (command.ToUpper().Trim()) { case "USER": { sw.WriteLine("331. Nhap pass vao"); sw.Flush(); //sw.Close(); Console.WriteLine(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(); try { Directory.CreateDirectory(folderName); sw.WriteLine("150 Tao thu muc thanh cong"); sw.Flush(); }catch(IOException){ sw.WriteLine("550 Tao thu muc co loi"); sw.Flush(); } break; } case "RETR": { string fileName = request.Substring(4, request.Length - 4); fileName = rootDir + "/" + fileName.Trim(); try { if (File.Exists(fileName)) { //Gui noi dung file ve cho client xu ly sw.WriteLine("150 Truyen File thanh cong"); sw.Flush(); FileStream fs = new FileStream(fileName, FileMode.Open); long totalLenght = fs.Length; byte[] data = new byte[totalLenght]; fs.Read(data, 0, data.Length); sw.Write(totalLenght); char[] kt = Encoding.ASCII.GetChars(data); sw.Write(kt,0,data.Length); sw.Flush(); fs.Close(); } else { sw.WriteLine("550 File khong ton tai tren server"); sw.Flush(); } } catch (IOException) { sw.WriteLine("550 Khong truyen duoc file"); sw.Flush(); } break; } case "STOR": { string fileName = request.Substring(request.LastIndexOf("/"),request.Length-request.LastIndexOf("/")); fileName = rootDir + "/" + fileName.Trim(); try { FileStream fs = new FileStream(fileName, FileMode.CreateNew); long totalLength=sr.Read(); byte[] data = new byte[totalLength]; char[] kt = Encoding.ASCII.GetChars(data); 86 int sobyte = sr.Read(kt, 0, data.Length); fs.Write(data, 0, sobyte); fs.Close(); sw.WriteLine("150 Up file thanh cong"); sw.Flush(); } catch (IOException) { sw.WriteLine("550 Khong truyen duoc file"); sw.Flush(); } break; } case "QUIT": { client.Close(); break; } default: { sw.WriteLine("Sai lenh"); sw.Flush(); break; } } } } } Chương trình Simple FTP Client: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; using System.Net.Sockets; namespace FtpClient { class Program { static void Main(string[] args) { IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2121); TcpClient client = new TcpClient(); client.Connect(iep); StreamReader sr = new StreamReader(client.GetStream()); StreamWriter sw = new StreamWriter(client.GetStream()); Console.WriteLine(sr.ReadLine()); string input; string command = ""; Console.WriteLine("Dang nhap bang USER Ten user, PASS Ten password"); Console.WriteLine("Tao thu muc bang MKD ten thu muc can tao"); Console.WriteLine("Upload bang cach STOR tenfile"); Console.WriteLine("Download bang cach RETR tenfile"); while (true) { input = Console.ReadLine(); 87 command = input.Substring(0, 4).Trim().ToUpper(); switch (command) { case "STOR": { //Doc file gui cho server sw.WriteLine(input); sw.Flush(); FileInfo fl=null; try { fl = new FileInfo(input.Substring(4, input.Length - 4).Trim()); } catch (IOException) { Console.WriteLine("File khong ton tai"); } long totalLength = fl.Length; FileStream fs = fl.OpenRead(); sw.Write(totalLength); byte[] data = new byte[totalLength]; int bytes = fs.Read(data, 0, data.Length); char[] kt = Encoding.ASCII.GetChars(data); sw.Write(kt, 0, data.Length); sw.Flush(); fs.Close(); Console.WriteLine(sr.ReadLine()); break; } case "RETR": { sw.WriteLine(input); sw.Flush(); string s = sr.ReadLine(); Console.WriteLine(s); if (s.Substring(0, 3).Equals("150")) { Console.Write("Nhap vao noi luu tep:"); string filename = Console.ReadLine(); FileStream fs = new FileStream(filename, FileMode.CreateNew); //Doc tep ve; long totalLength = sr.Read(); byte[] data = new byte[totalLength]; char[] kt= new char[data.Length] ; int sobyte = sr.Read(kt, 0, data.Length); data=Encoding.ASCII.GetBytes(kt); fs.Write(data, 0, data.Length); fs.Close(); } break; } default: { sw.WriteLine(input); sw.Flush(); Console.WriteLine(sr.ReadLine()); break; 88 } } if (input.ToUpper().Equals("QUIT")) break; } sr.Close(); sw.Close(); client.Close(); } } } 3.5. DNS (Domain Name Server) 3.5.1. Vấn ñề phân giải tên miền Domain Name System:  Là hệ cơ sở dữ liệu phân tán hoạt ñộng có thứ bậc bởi các name servers  Là giao thức tầng ứng dụng : host, routers yêu cầu tới name servers ñể xác ñịnh tên miền (ánh xạ ñịa chỉ tên miền)  Note : là một chức năng của Internet, hoạt ñộng như là giao thức tầng ứng dụng  Rất phức tạp. Q: Ánh xạ giữa ñịa chỉ IP và tên?  Tại sao không tập trung sự kiểm soát của DNS ?  ðiểm hỏng duy nhất - nếu name-server “chết” thì cả mạng Internet sẽ “chết” theo.  Tốn ñường truyền.  Cơ sở dữ liệu tập trung sẽ “xa” với ña số vùng  Bảo trì phức tạp.  Phải chia ñể trị !  Không có server nào có thể lưu toàn bộ ñược tên miền và ñịa chỉ IP tương ứng  local name servers:  Mỗi ISP,công ty có local (default) name server  Câu hỏi truy vấn của host về DNS sẽ ñược chuyển tới local name server  Chức năng của name server:  ðối với host: lưu ñịa chỉ IP và tên miền tương ứng của host  Có thể tìm tên miền ứng với ñịa chỉ IP và ngược lại  ðược yêu cầu bởi các local name server không thể xác ñịnh ñược tên.  root name server:  ðược yêu cầu nếu có authoritative name server không xác ñịnh.  Nhận và xử lý mapping  Trả về mapping cho local name server 89 b USC-ISI Marina del Rey, CA l ICANN Marina del Rey, CA e NASA Mt View, CA f Internet Software C. Palo Alto, CA i NORDUnet Stockholm k RIPE London m WIDE Tokyo a NSI Herndon, VA c PSInet Herndon, VA d U Maryland College Park, MD g DISA Vienna, VA h ARL Aberdeen, MD j NSI (TBD) Herndon, VA host surf.eurecom.fr muốn biết ñịa chỉ IP của gaia.cs.umass.edu 1. Yêu cầu tới local DNS server, dns.eurecom.fr 2. dns.eurecom.fr yêu cầu tới root name server nếu cần thiết 3. root name server yêu cầu authoritative name server, dns.umass.edu, nếu cần thiết. requesting host surf.eurecom.fr gaia.cs.umass.edu root name server authorititive name server dns.umass.edu local name server dns.eurecom.fr 1 2 3 4 5 6 90 Root name server:  Có thể không biết authoritative name server  Có thể biết name server trung gian ,nhờ ñó có thể yêu cầu tìm authoritative name server requesting host surf.eurecom.fr gaia.cs.umass.edu local name server dns.eurecom.fr 1 2 3 4 5 6 authoritative name server dns.cs.umass.edu intermediate name server dns.umass.edu 7 8 DNS example - Truy vấn trong DNS ñược chia thành các loại như sau: Truy vấn ñệ quy query:  Name server là nơi phân gi ải ñịa chỉ/tên.Nếu nó không phân giải trong nội bộ,nó sẽ gửi yêu cầu ñến name server khác.  Công việc của name server liệu có quá nặng? Truy vấn tương tác:  Nếu không phân giải ñược ñịa chỉ IP/name,name server sẽ gửi trả thông ñi ệp rằng “Tôi không biết,hãy thử hỏi anh bạn cạnh tôi là A”.A là ñ ịa chỉ IP của name server kế tiếp nó. requesting host surf.eurecom.fr gaia.cs.umass.edu local name server dns.eurecom.fr 1 2 3 4 5 6 authoritative name server dns.cs.umass.edu intermediate name server dns.umass.edu 7 8 iterated query - Cấu trúc bản ghi DNS như sau: 91 DNS: cơ sở dữ liệu phân tán lưu các bản ghi nguồn (RR)  Type=NS  name : domain (e.g. foo.com)  value : ñịa chỉ IP authoritative name server cho tên miền ñó ðịnh dạng của RR : (name, value, type, ttl)  Type=A  name : hostname  value : IP address  Type=CNAME  name : tên bí danh cho một tên thực nào ñó : e.g www.ibm.com là tên bí danh của servereast.backup2.ibm.com  value : là tên thực  Type=MX  value : tên của mailserver 3.5.2. Triển khai DNS MX (Mail Exchange) Chúng ta ñi viết chương trình cho phép lấy về thông tin của mail server using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btFind_Click(object sender, EventArgs e) { byte[] DNSQuery; byte[] DNSReply; UdpClient dnsClient = new UdpClient(tbServer.Text, 53); DNSQuery = makeQuery(DateTime.Now.Millisecond * 60, tbDomain.Text); dnsClient.Send(DNSQuery, DNSQuery.GetLength(0)); IPEndPoint endpoint = null; DNSReply = dnsClient.Receive(ref endpoint); this.tbStatus.Text = makeResponse(DNSReply, tbDomain.Text); } public byte[] makeQuery(int id, string name) { byte[] data = new byte[512]; byte[] Query; data[0] = (byte)(id >> 8); data[1] = (byte)(id & 0xFF); data[2] = (byte)1; data[3] = (byte)0; data[4] = (byte)0; data[5] = (byte)1; 92 data[6] = (byte)0; data[7] = (byte)0; data[8] = (byte)0; data[9] = (byte)0; data[10] = (byte)0; data[11] = (byte)0; string[] tokens = name.Split(new char[] { '.' }); string label; int position = 12; for (int j = 0; j < tokens.Length; j++) { label = tokens[j]; data[position++] = (byte)(label.Length & 0xFF); byte[] b = System.Text.Encoding.ASCII.GetBytes(label); for (int k = 0; k < b.Length; k++) { data[position++] = b[k]; } } data[position++] = (byte)0; data[position++] = (byte)0; data[position++] = (byte)15; data[position++] = (byte)0; data[position++] = (byte)1; Query = new byte[position + 1]; for (int i = 0; i <= position; i++) { Query[i] = data[i]; } return Query; } public string makeResponse(byte[] data, string name) { int qCount = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF); int aCount = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF); int position = 12; for (int i = 0; i < qCount; ++i) { name = ""; position = proc(position, data, ref name); position += 4; } string Response = ""; for (int i = 0; i < aCount; ++i) { name = ""; position = proc(position, data, ref name); position += 12; name = ""; position = proc(position, data, ref name); Response += name + "\r\n"; } return Response; } private int proc(int position, byte[] data, ref string name) { int len = (data[position++] & 0xFF); if (len == 0) { return position; } int offset; 93 do { if ((len & 0xC0) == 0xC0) { if (position >= data.GetLength(0)) { return -1; } offset = ((len & 0x3F) << 8) | (data[position++] & 0xFF); proc(offset, data, ref name); return position; } else { if ((position + len) > data.GetLength(0)) { return -1; } name += Encoding.ASCII.GetString(data, position, len); position += len; } if (position > data.GetLength(0)) { return -1; } len = data[position++] & 0xFF; if (len != 0) { name += "."; } } while (len != 0); return position; } } 3.6 Thảo luận về các ứng dụng khác thường gặp 3.7 Bài tập áp dụng 94 CHƯƠNG 4: XÂY DỰNG ỨNG DỤNG NHIỀU LỚP 4.1. Mô hình 2 lớp (two tier), 3 lớp (three tier) và n lớp. Trước ñây, ñối với các phần mềm có sử dụng liên quan ñến dữ liệu, thường khi làm người lập trình thường tích hợp việc giao tiếp với người sử dụng , xử lý rồi ghi xuống dữ liệu trên cùng một form (ñây là mô hình một lớp). Nhưng trong kiến trúc 3 lớp (mô hình 3 lớp), phải có việc phân biệt rạch ròi giữa các lớp này. Mô hình 3 lớp có thể ñược mô tả như sau: - Lớp thứ nhất : Lớp giao diện (giao tiếp với người sử dụng) : chỉ thuần xử lý việc giao tiếp với người sử dụng, nhập xuất, mà không thực hiện việc tính toán, kiểm tra, xử lý, hay các thao tác liên quan ñến cơ sở dữ liệu. - Lớp thứ hai : Lớp xử lý : Lớp này chuyên thực hiện các xử lý , kiểm tra các ràng buộc, các qui tắc ứng xử của phần mềm , các chức năng cốt yếu, Việc thực hiện này ñộc lập với cách thiết kế cũng như cài ñặt giao diện. Thông tin cho lớp này thực hiện các xử lý của mình ñược lấy từ lớp giao diện. - Lớp thứ ba : Lớp dữ liệu : Lớp này chuyên thực hiện các công việc liên quan ñến dữ liệu. Dữ liệu có thể lấy từ cơ sở dữ liệu (Access, SQL Server ) hoặc tập tin (text, binary, XML ). ðối với cơ sở dữ liệu, lớp này thực hiện kết nối trực tiếp với cơ sở dữ liệu và thực hiện tất cả các thao tác liên quan ñến cơ sở dữ liệu mà phần mềm cần thiết. ðối với tập tin, lớp này thực hiện việc ñọc, ghi tập tin theo yêu cầu của phần mềm. Việc thực hiện này do lớp xử lý gọi. 95 Rõ ràng, với mô hình này, các công việc của từng lớp là ñộc lập với nhau. Việc thay ñổi ở một lớp không làm thay ñổi các lớp còn lại, thuận tiện hơn cho quá trình phát triển và bảo trì phần mềm. Một số lưu ý:  Phân biệt vai trò Business Layer và khái niệm “xử lý”  Mỗi Layer vẫn có xử lý riêng, ñặc trưng của Layer ñó  ðôi khi việc quyết ñịnh 1 xử lý nằm ở layer nào chỉ mang tính chất tương ñối Chúng ta cũng cần phân biệt khái niệm 3 tier và 3 layer: 3 tier là mô hình 3 lớp vật lý còn 3 layer là mô hình logic. Ví dụ minh họa: Xây dựng chương trình tính tổng 2 phân số theo kiến trúc 3 lớp. Theo ñó dữ liệu của phân số ñược ñọc lên từ tập tin XML, kết quả sau khi ñược tính sẽ ñược ghi xuống tập tin XML. Cách làm thông thường là mọi việc ñều ñược ñẩy vào trong 1 form và xử lý trực tiếp trong form ñó. Tuy nhiên, khi có sự thay ñổi xảy ra về giao diện, xử lý, hay dữ liệu thì việc chỉnh sửa khá khó khăn. Do vậy, việc xây dựng theo kiến trúc 3 lớp sẽ khắc phục nhược ñiểm này. Kiến trúc của chương trình như sau: Browser Data tier Business tier Web Local Presentation Data Business logic Data Access Web GUI Application Web P h y sic a l v ie w Lo g ic a l v ie w 96 Xây dựng lớp thể hiện phân số (TH_PHANSO) Sử dụng User Control ñể cài ñặt cho TH_PHANSO. Thêm User Control vào project bằng cách chọn Project > Add User Control. ðặt tên User Control ñó. Ta có TH_PHANSO.cs 97 Do thể hiện tử số và thể hiện mẫu số ñều là TextBox do ñó trong lớp TH_PHANSO cần thiết lập các properties là tuso và mauso có kiểu int. public int tuso{ set{ this.txtTuSo.Text = value.ToString(); } get{ return int.Parse(this.txtTuSo.Text); } } public int mauso { set { this.txtMauSo.Text = value.ToString(); } get { return int.Parse(this.txtMauSo.Text); } } Lớp lưu trữ phân số (LT_PHANSO) Tập tin XML lưu trữ có ñịnh dạng như sau: 5 3 ðể thực hiện việc ñọc và ghi dữ liệu XML ta sử dụng DOM. Khai báo tuso và mauso ñể thực hiện việc lưu trữ public int tuso; public int mauso; Thực hiện cài ñặt hàm khởi tạo mặc ñịnh với tham số truyền vào là ñường dẫn file XML public LT_PHANSO(string strFilename) { // // TODO: Add constructor logic here // XmlDocument doc = LT_XML.DocTaiLieu(strFilename); if(doc == null) { tuso = 0; 98 mauso = 0; return; } XmlElement ele = doc.DocumentElement; tuso = int.Parse(ele.SelectSingleNode("Tu_so").InnerText); mauso = int.Parse(ele.SelectSingleNode("Mau_so").InnerText); } Thực hiện cài ñặt hàm ghi phân số với tham số truyền vào là ñường dẫn file XML public void GhiPhanSo(string strFilename) { XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("PHANSO"); doc.AppendChild(root); XmlElement ele_Tuso = root.OwnerDocument.CreateElement("Tu_so"); ele_Tuso.InnerText = this.tuso.ToString(); root.AppendChild(ele_Tuso); XmlElement ele_Mauso = root.OwnerDocument.CreateElement("Mau_so"); ele_Mauso.InnerText = this.mauso.ToString(); root.AppendChild(ele_Mauso); LT_XML.GhiTaiLieu(strFilename,doc); } Lớp lưu trữ XML (LT_XML) Việc load và save XmlDocument ñược tách ra thành một lớp riêng là lớp LT_XML public static XmlDocument DocTaiLieu(string strFilename) { XmlDocument kq = new XmlDocument(); try { kq.Load(strFilename); } catch{ return null; } return kq; } public static void GhiTaiLieu(string strFilename, XmlDocument doc) { try{ doc.Save(strFilename); } catch{ } } Lớp xử lý phân số (XL_PHANSO) 99 Lớp này sẽ thực hiện cài ñặt các hàm liên quan ñến xử lý và tính toán trên phân số như ñịnh nghĩa phép cộng 2 phân số, rút gọn phân số hay cập nhật giá trị từ ñối tượng thể hiện. Khai báo 2 ñối tượng lần lượt thuộc về lớp LT_PHANSO và TH_PHANSO ñể giúp tạo liên kết với tầng xử lý với 2 tầng còn lại là tầng dữ liệu và tầng giao diện. private LT_PHANSO lt_ps = null; private TH_PHANSO th_ps = null; Cài ñặt hàm khởi tạo mặc ñịnh ñể tạo liên kết với ñối tượng thể hiện và ñối tượng xử lý public XL_PHANSO(LT_PHANSO lt_ps, TH_PHANSO th_ps) { this.lt_ps = lt_ps; this.th_ps = th_ps; this.th_ps.tuso = this.lt_ps.tuso; this.th_ps.mauso = this.lt_ps.mauso; } Cài ñặt phương thức ghi public void Ghi(string strFilename) { this.lt_ps.tuso = this.th_ps.tuso; this.lt_ps.mauso = this.th_ps.mauso; this.lt_ps.GhiPhanSo(strFilename); } Cài ñặt toán tử + public static XL_PHANSO operator +(XL_PHANSO ps1,XL_PHANSO ps2) { XL_PHANSO kq = new XL_PHANSO(new LT_PHANSO(), new TH_PHANSO()); kq.th_ps.tuso = ps1.th_ps.tuso * ps2.th_ps.mauso + ps2.th_ps.tuso * 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ố public void RutGon() { int tuso = this.th_ps.tuso; int mauso = this.th_ps.mauso; int maxUC = TimMaxUocChung(tuso,mauso); tuso = tuso/maxUC; mauso = mauso/maxUC; 100 this.th_ps.tuso = tuso; this.th_ps.mauso = mauso; } ðể rút gọn ta cần tính ước chung lớn nhất, có thể cài ñặt hàm này chung với lớp XL_PHANSO public int TimMaxUocChung(int a, int b) { while(a!=b) { if(a>b) a -= b; else b -= a; } return a; } Thực hiện cài ñặt màn hình chính (MainFrm) Trong form chính sẽ thực hiện khai báo 3 ñối tượng xử lý phân số private PhanSo.XL_PHANSO xl_PhanSo1; private PhanSo.XL_PHANSO xl_PhanSo2; private PhanSo.XL_PHANSO xl_PhanSo3; Thực hiện khởi tạo 3 ñối tượng xử lý phân số vừa khai báo public MainFrm() { // // Required for Windows Form Designer support InitializeComponent(); xl_PhanSo1 = new XL_PHANSO(new LT_PHANSO("phanso1.xml"), tH_PHANSO1); 101 xl_PhanSo2 = new XL_PHANSO(new LT_PHANSO("phanso2.xml"), tH_PHANSO2); xl_PhanSo3 = new XL_PHANSO(new LT_PHANSO(""),tH_PHANSO3); } Viết hàm xử lý cho các nút chức năng trên form: Hàm xử lý cho nút Cộng private void btnCong_Click(object sender, System.EventArgs e) { XL_PHANSO kq = xl_PhanSo1 + xl_PhanSo2; xl_PhanSo3.CapNhat(kq); xl_PhanSo3.Ghi(“ketqua.xml”); xl_PhanSo3.RutGon(); } Hàm xử lý cho nút Thoat private void btnThoat_Click(object sender, System.EventArgs e) { this.Close(); } Tạo các tập tin phanso1.xml, phanso2.xml, có ñịnh dạng như ví dụ ở trên. Thực hiện biên dịch và chạy thử chương trình. Nhận xét : Thực hiện cài ñặt với kiến trúc 3 lớp sẽ giúp chương trình dễ dàng thay ñổi, tái sử dụng lại chương trình. Ví dụ: TH_PHANSO không thể hiện tử số và mẫu số bằng TextBox nữa mà thay bằng control khác (ví dụ như MyControl thì cũng không ảnh hưởng, lúc ñó chỉ cần thay ñổi code trong phần property tử số và mẫu số mà thôi. public int tuso{ set{ this.MyControl.Value = value.ToString(); } get{ return int.Parse(this.MyControl.Value); } } public int mauso { set { this.MyControl.Value = value.ToString(); } get { return int.Parse(this.MyControl.Value); } } Khi không lưu trữ bằng XML mà chuyển sang dùng cơ sở dữ liệu thì ta chỉ cần thay code phần LT_PHANSO, mà không cần thay ñổi code phần TH_PHANSO, cũng như XL_PHANSO. 102 Chú ý: Không phụ thuộc phương pháp lập trình. Mỗi nghiệp vụ không nhất thiết chỉ ñược giải quyết bởi 3 ñối tượng. Không là một kiến trúc “siêu việt”. 4.2. Remoting 4.2.1. Giới thiệu về Remoting .NET Remoting là gì? - Trước hết .NET Remoting là một kĩ thuật .NET ñược giới thiệu từ .NET framework 1.1. Cùng với .NET Webservice, .NET remoting là lựa chọn cho giải pháp xử lý tính toán từ xa. .NET Remoting là một kĩ thuật cho phép một ñối tượng này truy xuất ñến một ñối tượng khác nằm ở các Application Domain khác nhau. Và nếu giải thích theo kiểu bình dân, ta có thể sử dụng .NET Remoting ñế gọi một chương trình hoặc một service chạy trên một máy vi tính khác ñể xử lý một cái gì ñó và trả kết quả tính toán lại cho ta. Hình 4.1: .NET Remoting Overview .NET Remoting và Distributed COM - Vào năm một ngàn chín trăm hồi ñó, người ta thường thực hiện việc giao tiếp giữa các process bằng cách sử dụng Distributed COM hay còn gọi là DCOM. DCOM ñã rất hữu ích cho những chương trình chạy trên các máy tính cùng loại và nằm trong cùng một mạng. Tuy nhiên, DCOM trở nên lỗi thời vì nó không thể chạy trên Internet. DCOM dựa trên một tập giao thức mà không phải object nào cũng hỗ trợ và ñiều này khiến DCOM không chạy ñược trên những platform khác nhau. Ngoài ra, DCOM sử dụng nhiều port trong khi các port ấy thường bị chặn bởi firewall. Tất nhiên mở những port ñó ñể nó hoạt ñộng ñược không khó nhưng ñó là một trong những phiền phức. - .NET Remoting khắc phục những yếu kém của DCOM bằng cách hỗ trợ nhiều giao thức khác nhau. .NET Remoting và Web Services - Về khía cạnh xử lý từ xa thì Web Services hoàn toàn tương tự như .NET Remoting. Thậm chí người ta có thể làm cho .NET Remoting trở thành 1 Web Services bằng cách 103 host nó trong IIS. Web Services cho phép các ứng dụng có thể giao tiếp với nhau mà không phụ thuộc platform, ngôn ngữ lập trình, Tuy nhiên Web Services là một môi trường “stateless”, có nghĩa là nó không lưu lại bất kì trạng thái gì của lần gọi trước và nó cũng không biết gì về phía client ñang thực hiện request. Client và server Web Services chỉ có thể trao ñổi với nhau bằng các thông ñiệp SOAP. Những ñiều sau ñây là các ñiểm khác nhau chính giữa .NET Remoting và Web Serices, chúng cũng là những nhân tố ñể ta chọn lựa giữa 2 công nghệ này: • ASP.NET Web Services chỉ có thể ñược truy xuất qua HTTP còn .NET Remoting có thể ñược dùng trên nhiều giao thức khác nhau như TCP, HTTP. • Web Services là một môi trường stateless. Khi có một request từ phía client, sẽ có một object mới ñược tạo ra ñể thực hiện request ñó trên server. Còn .NET Remoting lại hỗ trợ nhiều lựa chọn state management và có thể thực hiện nhiều request từ một client, ñồng thời có hỗ trợ callbacks. • Web Services serialize các ñối tượng thành XML bên trong SOAP message và vì thế có thể truyền tải thông tin của bất cứ thành phần nào miễn có thể chuyển thành XML. Còn ñối với .NET Remoting thì tùy giao thức và ñịnh dạng message mà nó có thể truyền ñi thông tin như thế nào. Ngoài ra theo như giới thiệu thì .NET Remoting có cho phép ñối tượng ñược truyền vào theo cả kiểu tham chiếu(reference) và tham trị (value) • Web services có thể hoạt ñộng trên các platform môi trường khác nhau trong khi .NET Remoting yêu cầu phía clients phải là .NET application. Channels - Trong kĩ thuật .NET Remoting thì Channel ñược hiểu như là một kênh ñể giao tiếp giữa client và server. Một object từ client sẽ thông qua Channel ñể giao tiếp với object phía server, Channel sẽ truyền tải những message từ hai phía. Như giới thiệu phía trên thì có hai channel chính là TcpChannel và HttpChannel tương ứng với các giao thức TCP và HTTP. Ngoà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 hoá. - 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 khoá 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 toá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 toá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 toàn, toà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 toàn và toà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 ngoà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 hoàn toà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 ñể hoà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 hoàn toà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

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_lap_trinh_mang_voi_c.pdf