1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng lập trình mạng chương 2 ths trần bá nhiệm

28 0 0

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

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề I/O Trong .NET
Tác giả ThS. Trần Bá Nhiệm
Trường học trường đại học
Chuyên ngành lập trình mạng
Thể loại bài giảng
Năm xuất bản 2011
Định dạng
Số trang 28
Dung lượng 499,88 KB

Nội dung

Trang 1 CHƯƠNG 2VẤN ĐỀ I/O TRONG .NETThS.. Trần Bá NhiệmWebsite: sites.google.com/site/tranbanhiemEmail: tranbanhiem@gmail.comNội dung• Giới thiệu• Streams– Streams cho tập tin– Encoding

6/29/2011 CHƯƠNG VẤN ĐỀ I/O TRONG NET ThS Trần Bá Nhiệm Website: sites.google.com/site/tranbanhiem Email: tranbanhiem@gmail.com Nội dung • Giới thiệu • Streams – Streams cho tập tin – Encoding data – Stream cho liệu nhị phân text – Serialization – Xuất sở liệu dùng stream 6/29/2011 Chương 2: I/O NET 6/29/2011 Giới thiệu • I/O vấn đề quan trọng truyền thông mạng • Chương khảo sát hoạt động I/O bên • Khảo sát vấn đề stream để phục vụ cho việc chuyển đổi đối tượng phức tạp sang stream 6/29/2011 Chương 2: I/O NET Streams • Kiến trúc dựa stream phát triển NET • Các thiết bị I/O bao gồm từ máy tin, đĩa cứng card mạng • Khơng phải thiết bị có chức giống stream khơng hỗ trợ phương thức giống • canRead(), canSeek(), canWrite() khả stream ứng với thiết bị cụ thể 6/29/2011 Chương 2: I/O NET 6/29/2011 Streams • Hai stream quan trọng: networkStream fileStream • Hai cách dùng stream: đồng bất đồng • Khi dùng đồng bộ: luồng (thread) tương ứng tạm ngưng đến tác vụ hoàn thành lỗi • Khi dùng khơng đồng bộ: luồng (thread) tương ứng tức quay phương thức gọi lúc tác vụ hồn thành có dấu hiệu thị, lỗi xảy 6/29/2011 Chương 2: I/O NET Streams • Kiểu chương trình “treo” để chờ tác vụ hồn thành khơng “thân thiện” cho lắm, phương thức gọi đồng phải dùng luồng riêng • Bằng cách dùng luồng phương thức gọi đồng làm cho có cảm giác máy tính làm nhiều việc lúc Thực tế, hầu hết máy tính có CPU, nên điều đạt chuyển tác vụ khoảng vài milliseconds 6/29/2011 Chương 2: I/O NET 6/29/2011 Streams cho file • Khởi tạo ứng dụng NET mới, thêm vào: – Một form – Một File Open Dialog control với tên openFileDialog – Một textbox với tên tbResults, lập thuộc tính multiline=true – Hai buttons với tên btnReadAsync btnReadSync 6/29/2011 Chương 2: I/O NET Streams cho file • Sử dụng namespace: using System.IO; • Khai báo: FileStream fs; byte[] fileContents; AsyncCallback callback; delegate void InfoMessageDel(String info); Khai báo thêm phương thức InfoMessageDel để tránh vấn đề tranh chấp thread tham chiếu đến đối tượng lập trình mạng 6/29/2011 Chương 2: I/O NET 6/29/2011 Streams cho file • Thêm code xử lý biến cố Click đối tượng btnReadAsync: private void btnReadAsync_Click(object sender, EventArgs e) { openFileDialog.ShowDialog(); callback = new AsyncCallback(fs_StateChanged); fs = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true); fileContents = new Byte[fs.Length]; fs.BeginRead(fileContents, 0, (int)fs.Length, callback, null); } • Chú ý: Đọc 4096 byte/lần cách hiệu 6/29/2011 Chương 2: I/O NET Streams cho file • Nội dung hàm fs_StateChanged: private void fs_StateChanged(IAsyncResult asyncResult) { if (asyncResult.IsCompleted) { string s = Encoding.UTF8.GetString (fileContents); InfoMessage(s); fs.Close(); } } 6/29/2011 Chương 2: I/O NET 10 6/29/2011 Streams cho file • Thêm code xử lý biến cố Click đối tượng btnReadSync: private void btnReadSync_Click(object sender, EventArgs e) { openFileDialog.ShowDialog(); Thread thdSyncRead = new Thread(new ThreadStart(syncRead)); thdSyncRead.Start(); } 6/29/2011 Chương 2: I/O NET 11 Streams cho file public void syncRead() { FileStream fs; try { fs = new FileStream(openFileDialog.FileName, FileMode.OpenOrCreate); } catch (Exception ex) { MessageBox.Show(ex.Message); return; } 6/29/2011 Chương 2: I/O NET 12 6/29/2011 Streams cho file fs.Seek(0, SeekOrigin.Begin); byte[] fileContents = new byte[fs.Length]; fs.Read(fileContents, 0, (int)fs.Length); string s = Encoding.UTF8.GetString(fileContents); InfoMessage(s); fs.Close(); } 6/29/2011 Chương 2: I/O NET 13 FileStream Phương thức Mục đích thuộc tính Khởi tạo thực thể FileStream Constructor Độ dài file, giá trị kiểu long Length Position Lấy thiết lập vị trí trỏ file, giá trị kiểu long BeginRead() BeginWrite() Bắt đầu đọc bất đồng Write Bắt đầu ghi bất đồng Read Lock Ghi khối byte vào stream dùng liệu đệm 6/29/2011 Đọc khối byte từ stream ghi vào đệm Ngăn cản việc tiến trình khác truy xuất vào tất phần file Chương 2: I/O NET 14 6/29/2011 Encoding data • Trong ví dụ trước ta dùng Encoding.UTF8.GetString() để chuyển đổi mảng byte thành string • Các dạng hợp lệ Unicode (Encoding.Unicode), ASCII, UTF7 • UTF8 dùng byte cho ký tự, Unicode dùng byte cho ký tự 6/29/2011 Chương 2: I/O NET 15 Binary text streams • Plain tex dạng thức phổ biến dùng stream để người dễ đọc soạn thảo Tương lai thay XML • Đặc tính chung plain text đơn vị thông tin kết thúc với mã enter (tổ hợp hai mã UTF8 10 13 C# hay vbCrLf VB.NET) 6/29/2011 Chương 2: I/O NET 16 6/29/2011 Binary text streams private void btnRead_Click(object sender, System.EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.ShowDialog(); FileStream fs = new FileStream(ofd.FileName, FileMode.OpenOrCreate); StreamReader sr = new StreamReader(fs); int lineCount = 0; 6/29/2011 Chương 2: I/O NET 17 Binary text streams while (sr.ReadLine() != null) { lineCount++; } fs.Close(); MessageBox.Show("There are " + lineCount + " lines in " + ofd.FileName); } 6/29/2011 Chương 2: I/O NET 18 6/29/2011 StreamReader Phương thức Mục đích Thuộc Khởi tạo thực thể StreamReader tính Trả ký tự kế tiếp, giá trị -1 đến cuối Constructor stream Peek Đọc ký tự tập ký tự từ input stream Read Đọc ký tự từ stream hành ghi liệu vào đệm, bắt đầu vị trí định ReadBlock Đọc dịng ký tự từ stream hành trả dạng string ReadLine Đọc từ vị trí hành đến cuối stream ReadToEnd 6/29/2011 Chương 2: I/O NET 19 StreamReader private void btnWrite_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.ShowDialog(); FileStream fs = new FileStream(sfd.FileName, FileMode.CreateNew); BinaryWriter bw = new BinaryWriter(fs); int[] myArray = new int[1000]; 6/29/2011 Chương 2: I/O NET 20 10 6/29/2011 Serialization public purchaseOrder() { _purchaseOrderStatus = purchaseOrderStates.ISSUED; _issuanceDate = DateTime.Now; } public void recordDelivery() { if (_purchaseOrderStatus == purchaseOrderStates.ISSUED) { _purchaseOrderStatus = purchaseOrderStates.DELIVERED; _deliveryDate = DateTime.Now; } } 6/29/2011 Chương 2: I/O NET 27 Serialization dùng SoapFormatter company Vendor = new company(); company Buyer = new company(); lineItem Goods = new lineItem(); purchaseOrder po = new purchaseOrder(); Vendor.name = "Acme Inc."; Buyer.name = "Wiley E Coyote"; Goods.description = "anti-RoadRunner cannon"; Goods.quantity = 1; Goods.cost = 599.99; po.items = new lineItem[1]; po.items[0] = Goods; po.buyer = Buyer; po.vendor = Vendor; SoapFormatter sf = new SoapFormatter(); FileStream fs = File.Create(" \\po.xml"); sf.Serialize(fs, po); fs.Close(); 6/29/2011 Chương 2: I/O NET 28 14 6/29/2011 Deserialization dùng SoapFormatter SoapFormatter sf = new SoapFormatter(); FileStream fs = File.OpenRead(" \\po.xml"); purchaseOrder po = (purchaseOrder)sf.Deserialize(fs); fs.Close(); MessageBox.Show("Customer is " + po.buyer.name + "\nVendor is " + po.vendor.name + ", phone is " + po.vendor.phone + "\nItem is " + po.items[0].description + " has quantity " + po.items[0].quantity.ToString() + ", has cost " + po.items[0].cost.ToString()); 6/29/2011 Chương 2: I/O NET 29 SoapFormatter Simple Object Access Protocol (SOAP) Phương thức Mục đích thuộc tính Constructor Khởi tạo thực thể SoapFormatter Deserialize Deserialize stream thành đối tượng, đồ thị Serialize Serialize đối tượng đồ thị liên kết với đối tượng AssemblyFormat Lấy thiết lập định dạng, assembly names serialize TypeFormat Lấy thiết lập định dạng, type descriptions cấu trúc sẵn stream serialize TopObject Lấy thiết lập ISoapMessage đối tượng nằm SOAP deserialize 6/29/2011 Chương 2: I/O NET 30 15 6/29/2011 Kết minh họa 6/29/2011 Chương 2: I/O NET 31 Serialization dùng BinaryFormatter • Định dạng SOAP tương đối ấn tượng, nhiên không gọn nhẹ nên tiêu tốn băng thơng đường truyền • Trong trường hợp ấy, phương pháp khả thi BinaryFormatter 6/29/2011 Chương 2: I/O NET 32 16 6/29/2011 Serialization dùng BinaryFormatter company Vendor = new company(); company Buyer = new company(); lineItem Goods = new lineItem(); //tương tự ví dụ SoapFormatter BinaryFormatter bf = new BinaryFormatter(); FileStream fs = File.Create(" \\po_bin.txt"); bf.Serialize(fs, po); fs.Close(); MessageBox.Show("Serialize succesful!", "Info"); 6/29/2011 Chương 2: I/O NET 33 Deserialization dùng BinaryFormatter BinaryFormatter bf = new BinaryFormatter(); FileStream fs = File.OpenRead(" \\po_bin.txt"); purchaseOrder po = (purchaseOrder)bf.Deserialize(fs); fs.Close(); MessageBox.Show("Customer is " + po.buyer.name); 6/29/2011 Chương 2: I/O NET 34 17 6/29/2011 Kết minh họa 6/29/2011 Chương 2: I/O NET 35 Shallow serialization • Bất kỳ đối tượng serialized khơng có thành viên private protected gọi Shallow serialization • Tuy nhiên phương pháp gây chép sai đối tượng, giải việc tham chiếu vòng tròn đối tượng 6/29/2011 Chương 2: I/O NET 36 18 6/29/2011 Shallow serialization • Thuận lợi sử dụng XML schema definition (XSD) để định nghĩa kiểu • Các chuẩn XSD bảo đảm thể xác tảng • SOAP formatter dùng hệ thống dạng CLR khơng chuẩn hóa tảng NET 6/29/2011 Chương 2: I/O NET 37 Serialization dùng XmlSerializer company Vendor = new company(); company Buyer = new company(); lineItem Goods = new lineItem(); //tương tự ví dụ SoapFormatter XmlSerializer xs = new XmlSerializer(po.GetType()); FileStream fs = File.Create(" \\po1.xml"); xs.Serialize(fs, po); fs.Close(); 6/29/2011 Chương 2: I/O NET 38 19 6/29/2011 Deserialization dùng XmlSerializer purchaseOrder po = new purchaseOrder(); XmlSerializer xs = new XmlSerializer(po.GetType()); FileStream fs = File.OpenRead(" \\po1.xml"); po = (purchaseOrder)xs.Deserialize(fs); fs.Close(); MessageBox.Show("Customer is " + po.buyer.name + "\nVendor is " + po.vendor.name + ", phone is " + po.vendor.phone + "\nItem is " + po.items[0].description + " has quantity " + po.items[0].quantity.ToString() + ", has cost " + po.items[0].cost.ToString()); 6/29/2011 Chương 2: I/O NET 39 XmlSerializer Phương thức Mục đích thuộc tính Constructor Khởi tạo thực thể XmlSerializer Deserialize Deserialize tài liệu XML Serialize Serialize đối tượng thành tài liệu XML FromTypes Trả mảng đối tượng XmlSerializer tạo từ mảng kiểu CanDeserialize Lấy giá trị cho biết XmlSerializer deserialize tài liệu XML hay khơng 6/29/2011 Chương 2: I/O NET 40 20

Ngày đăng: 02/03/2024, 13:54