Chương 11 : Lập trình Mạng
Microsoft .NET Framework bao gồm một tập các lớp dùng để lập trình mạng thuộc hai
không gian tên: System.Net và System.Net.Sockets. Các lớp này hỗ trợ mọi thứ, từ lập
trình dựa-trên-socket với TCP/IP cho đến download file và trang HTML từ web thông
qua HTTP. Hai không gian tên này cũng là nền tảng cho hai nền networking cấp cao
hơn—Remoting và dịch vụ Web XML. Hai nền này sẽ được đề cập chi tiết trong chương
12. Chương này sẽ trình bày các vấn đề sau:
Lấy tài nguyên từ web thông qua HTTP (mục 11.1, 11.2, và 11.3).
Hiển thị một trang web trong một ứng dụng dựa-trên-Windows bằng điều kiểm Web
Browser (mục 11.4).
Lấy địa chỉ IP và thông tin DNS về máy tính hiện hành và các miền khác trên World
Wide Web (mục 11.5 và 11.6).
Gửi thông điệp “ping” (mục 11.7) và giao tiếp bằng giao thức TCP và UDP (mục
11.8 đến 11.13).
Gửi và nhận e-mail (mục 11.14 và 11.15).
1.1 Download file thông qua HTTP
V
V
Bạn cần một cách thật nhanh và đơn giản để download một file từ một website
thông qua HTTP.
#
#
Sử dụng phương thức tĩnh DownloadFile của lớp System.Net.WebClient.
.NET Framework cung cấp vài cơ chế dùng để gửi dữ liệu thông qua HTTP. Một trong
những cách dễ nhất là sử dụng lớp System.Net.WebClient. Nó cung cấp những phương
thức mức-cao như DownloadFile và UploadFile. Các phương thức này không có sự hỗ
trợ nội tại nào cho giao tiếp bất đồng bộ, hay xác thực. Nếu cần các tính năng này, bạn có
thể sử dụ
ng các chức năng phức tạp hơn do lớp WebRequest và WebResponse cung cấp
(sẽ được mô tả trong mục 11.2 và 11.3).
Chương trình ví dụ dưới đây sẽ download file winXP.gif từ localhost và lưu vào đĩa.
using System;
using System.Net;
using System.IO;
public class Download {
private static void Main() {
string remoteUri =
"http://localhost/winXP.gif";
string localFileName = "winXP.gif";
WebClient client = new WebClient();
Console.WriteLine("Downloading file " +
remoteUri + " to " + Path.GetFullPath(localFileName));
// Thực hiện download.
client.DownloadFile(remoteUri, localFileName);
Console.WriteLine("Download complete.");
Console.ReadLine();
}
}
1.2 Download và xử lý file bằng stream
V
V
Bạn cần lấy một file từ một website, nhưng không muốn lưu trực tiếp vào đĩa.
Thay vào đó, bạn muốn xử lý ngay trong ứng dụng của mình.
#
#
Sử dụng lớp WebRequest để tạo yêu cầu, lớp WebResponse để nhận đáp ứng
từ web-server, và một số dạng reader (StreamReader đối với dữ liệu HTML
hay text, hoặc BinaryReader đối với dữ liệu nhị phân) để phân tích đáp ứng đó.
Download một file cần bốn bước cơ bản sau:
1. Sử dụng phương thức tĩnh Create của lớp System.Net.WebRequest để chỉ định trang
bạ
n cần. Phương thức này trả về một đối tượng dẫn xuất từ WebRequest, phụ thuộc
vào kiểu Uniform Resource Identifier (URI) bạn sử dụng. Ví dụ, nếu tài nguyên là
HTTP (với cụm từ http://), nó sẽ tạo ra đối tượng HttpWebRequest; nếu tài nguyên
là file (với cụm từ file://), nó sẽ tạo ra đối tượng FileWebRequest. Bạn có thể thiết
lập thời gian trễ thông qua thuộc tính WebRequest.Timeout.
2. Sử d
ụng phương thức GetResponse của đối tượng WebRequest, phương thức này trả
về một đối tượng WebResponse cho trang. Nếu yêu cầu vượt qua thời gian trễ thì
ngoại lệ WebException sẽ bị ném.
3. Tạo một StreamReader hoặc một BinaryReader cho WebResponse.
4. Công việc cuối cùng là xử lý stream này, chẳng hạn ghi nó ra file rồi hiển thị trong
ứng dụng của bạn
Đoạn mã dưới đây sẽ lấy và hiển thị mộ
t file ảnh và nội dung HTML của một trang web.
using System;
using System.Net;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
public class DownloadForm : System.Windows.Forms.Form {
private System.Windows.Forms.PictureBox picBox;
private System.Windows.Forms.TextBox textBox;
// (Bỏ qua phần mã designer.)
private void DownloadForm_Load(object sender, System.EventArgs e) {
string picUri =
"http://localhost/winXP.gif";
string htmlUri =
"http://localhost/iishelp/iis/misc/default.asp";
// Tạo yêu cầu.
WebRequest requestPic = WebRequest.Create(picUri);
WebRequest requestHtml = WebRequest.Create(htmlUri);
// Nhận đáp ứng. Công việc này sẽ mất nhiều
// thời gian, đặc biệt khi file cần lấy quá lớn.
WebResponse responsePic = requestPic.GetResponse();
WebResponse responseHtml = requestHtml.GetResponse();
// Đọc response stream.
Image downloadedImage =
Image.FromStream(responsePic.GetResponseStream());
StreamReader r =
new StreamReader(responseHtml.GetResponseStream());
string htmlContent = r.ReadToEnd();
r.Close();
// Hiển thị ảnh.
picBox.Image = downloadedImage;
// Hiển thị nội dung dạng text của trang HTML.
textBox.Text = htmlContent;
}
}
Hình 11.1 Download nội dung của một trang web
Để download file lớn một cách hiệu quả, bạn có thể sử dụng kỹ thuật bất đồng bộ đã
được mô tả trong chương 4. Bạn cũng có thể sử dụng phương thức
WebRequest.BeginGetResponse, phương thức này không chặn mã lệnh của bạn và sẽ gọi
thủ tục callback khi nhận được đáp ứng.
1.3 Lấy trang HTML từ một website có yêu cầu xác thực
V
V
Bạn cần thu lấy một file từ một website, nhưng website đó yêu cầu một số
thông tin xác thực.
#
#
Sử dụng lớp WebRequest và WebResponse đã được mô tả trong mục 11.2. Tuy
nhiên, trước khi gửi yêu cầu, bạn phải cấu hình thuộc tính
WebRequest.Credentials với các thông tin xác thực.
Một số website yêu cầu thông tin xác thực từ người dùng. Khi kết nối thông qua trình
duyệt, thông tin này có thể được cung cấp một cách trong suốt (ví dụ, một intranet-site
cục bộ có sử dụng Integrated Windows authentication), hoặc trình duyệt có thể yêu cầu
The image part with relationsh ip ID rId 5 was not fo und in the file.
thông tin này thông qua một hộp thoại đăng nhập. Khi truy xuất một trang web bằng lập
trình thì mã lệnh của bạn cần phải cung cấp các thông tin này.
Cách tiếp cận mà bạn sử dụng tùy thuộc vào kiểu xác thực mà website sử dụng.
• Nếu website sử dụng Basic authentication hay Digest authentication, bạn cần gửi
kết hợp username và password, bằng cách tạo một đối tượng System.Net.
NetworkCredential và gán nó vào thuộc tính WebRequest.Credentials.
• Nếu website sử dụng Integrated Windows authentication
, bạn thực hiện tương tự
như trên. Bạn có thể lấy các thông tin đăng nhập của người dùng hiện hành từ đối
tượng System.Net.CredentialCache.
• Nếu website đòi hỏi chứng chỉ, bạn cần nạp chứng chỉ từ một file bằng lớp
System.Security.Cryptography.X509Certificates.X509Certificate, và thêm nó vào
tập hợp HttpWebRequest.ClientCertificates.
Dưới đây là đoạn mã ví dụ cho cả ba cách tiếp cận trên:
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class DownloadWithAuthentication {
private static void Main() {
string uriBasic, uriIntegrated, uriCertificate;
// Xác thực username và password với Basic authentication.
WebRequest requestA = WebRequest.Create(uriBasic);
requestA.Credentials =
new NetworkCredential("userName", "password");
requestA.PreAuthenticate = true;
// Đăng nhập người dùng hiện hành với
// Integrated Windows authentication.
WebRequest requestB = WebRequest.Create(uriIntegrated);
requestB.Credentials = CredentialCache.DefaultCredentials;
requestB.PreAuthenticate = true;
// Xác thực người dùng bằng chữ ký điện tử.
HttpWebRequest requestC = (HttpWebRequest)
WebRequest.Create(uriCertificate);
X509Certificate cert =
X509Certificate.CreateFromCertFile(@"c:\user.cer");
requestC.ClientCertificates.Add(cert);
// (Bây giờ bắt đầu lấy và xử lý đáp ứng.)
}
}
# Nhớ rằng, nếu muốn sử dụng kiểu xác thực chứng chỉ, bạn phải nạp chứng chỉ
từ file. Không có cách nào để tạo đối tượng X509Certificate từ một chứng chỉ
trong kho chứng chỉ của máy tính.
1.4 Hiển thị trang web trong ứng dụng dựa-trên-Windows
V
V
Bạn cần hiển thị một trang HTML (hay bất kỳ kiểu tài liệu nào mà Microsoft
Internet Explorer hỗ trợ) trong một ứng dụng dựa-trên-Windows.
#
#
Sử dụng điều kiểm ActiveX Web Browser (đi cùng với Internet Explorer).
.NET Framework không cung cấp điều kiểm nào dùng để dịch nội dung HTML. Tuy
nhiên, chức năng này lại rất cần thiết cho việc hiển thị một nội dung HTML cục bộ (kể cả
những tài liệu HTML đóng gói theo định dạng file trợ giúp của Windows) cũng như các
thông tin nào đó từ web.
Để hiển thị một trang HTML, bạn có thể thêm một cửa sổ Internet Explorer vào ứng dụng
dựa-trên-Windows. Cửa sổ này không chỉ hỗ trợ HTML, mà còn hỗ trợ JavaScript,
Microsoft Visual Basic Scripting Edition (VBScript), ActiveX control, và rất nhiều plug-in
khác, tùy thuộc vào cấu hình hệ thống của bạn (có thể gồm cả Microsoft Word, Microsoft
Excel, và Adobe Acrobat Reader). Bạn còn có thể sử dụng đ
iều kiểm Web Browser để
duyệt một thư mục trong ổ đĩa cục bộ, hay hiển thị các file trên một FTP (File Transfer
Protocol) site.
Để thêm Web Browser vào một dự án trong Microsoft Visual Studio .NET, bạn hãy nhắp
phải vào hộp công cụ và chọn Add/Remove Items. Sau đó, chọn thẻ COM Components, và
chọn Microsoft Web Browser (xem hình 11.2). Theo đó, điều kiểm Microsoft Web
Browser sẽ được thêm vào hộp công cụ
. Khi bạn thả điều kiểm này vào form, các Interop
Assembly cần thiết sẽ được tạo ra và thêm vào dự án của bạn.
Hình 11.2 Chọn Microsoft Web Browser trong hộp thoại Customize Toolbox
Nếu không sử dụng Visual Studio .NET, bạn cần tạo ra một vỏ bọc bằng tiện ích Type
Library Importer (Tlbimp.exe), sẽ được giải thích trong mục 15.6.
Khi sử dụng điều kiểm Web Browser, bạn thường cần các phương thức sau:
• Navigate (và Navigate2)⎯Chuyển trang sang URL do bạn chỉ định.
• GoBack và GoForward⎯Lái sang các trang trong danh sách history.
• GoHome
⎯Lái sang trang mặc định (home) được thiết lập trên máy tính hiện hành,
và GoSearch⎯Hiển thị trang tìm kiếm.
Người dùng có thể vào một trang mới bằng cách nhắp vào một liên kết nào đó trong trang
hiện hành (nếu nó tồn tại). Bạn có thể lấy URL hiện hành từ thuộc tính LocationURL và
xác định điều kiểm vẫn còn xử lý trang đó hay không bằng cách kiểm tra thuộc tính
Busy. Ngoài ra, bạn có thể phản ứng với nhiều s
ự kiện khác nhau.
The image part with relationsh ip ID rI d6 was not fo und in the file.