Ta có thể hỏi lý do tại sao bạn nên phát triển một máy chủ trong NET khi IIS là tự do có sẵn. Một máy chủ trong nhà phát triển có một số lợi thế, chẳng hạn như sau đây:
+ Máy chủ Web có thể được cài đặt như một phần của một ứng dụng, mà không đòi hỏi người sử dụng phải cài đặt IIS bằng tay từ đĩa CD cài đặt Windows.
+ IIS sẽ không cài đặt trên Windows XP Home Edition, chiếm một phần đáng kể người dùng Windows
3.1 Thực thi một máy chủ Web
Bắt đầu một mới Visual Studio. Dự án NET như bình thường. Vẽ hai textbox, tbPath và tbPort, vào biểu mẫu, theo sau bằng một nút, btnStart, và một hộp danh sách tên là lbConnections, trong đó có xem nó vào danh sách. Tại trung tâm của một máy chủ HTTP là một máy chủ TCP, và bạn có thể nhận thấy một trùng mã giữa các ví dụ này và máy chủ TCP trong chương trước. Các máy chủ đã được đa luồng, vì vậy bước đầu tiên là khai báo một danh sách mảng để chứa:
publicpartialclass Form1 : Form {
private ArrayList alSockets; ……..
}
Thực thi-Path, mà trả về không chỉ con đường mà còn tên tập tin, và do đó chúng tôi có thể cắt bỏ tất cả các ký tự sau khi người cuối cùng dấu gạch chéo ngược Mỗi máy chủ HTTP có một gốc rễ HTTP, mà là một đường dẫn đến một thư mục trên đĩa cứng của bạn mà từ đó các máy chủ sẽ lấy các trang Web. IIS có một gốc HTTP mặc định C: \inetpub\wwwroot, trong trường hợp này, chúng ta sẽ sử dụng đường dẫn trong đó ứng dụng được lưu. Để có được đường dẫn ứng dụng, chúng ta có thể sử dụng ứng dụng. Thực thi-Path, mà trả về không chỉ con đường mà còn tên tập tin, và do đó chúng tôi có thể cắt bỏ tất cả các ký tự sau khi người cuối cùng dấu gạch chéo ngược.
privatevoid Form1_Load(object sender, EventArgs e) {
tbPath.Text = Application.ExecutablePath; // trim off filename, to get the path
tbPath.Text = tbPath.Text.Substring(0, tbPath.Text.LastIndexOf("\\")); }
privatevoid btnStart_Click(object sender, EventArgs e) {
alSockets = new ArrayList();
Thread thdListener = new Thread(new ThreadStart(listenerThread)); thdListener.Start();
}
publicvoid listenerThread() {
int port = 0;
port = Convert.ToInt16(tbPort.Text);
TcpListener tcpListener = new TcpListener(port); tcpListener.Start();
while (true) {
Socket handlerSocket = tcpListener.AcceptSocket(); if (handlerSocket.Connected) { lbConnections.Items.Add(handlerSocket.RemoteEndPoint.ToString() + " connected."); lock (this) { alSockets.Add(handlerSocket); ThreadStart thdstHandler = new
ThreadStart(handlerThread);
Thread thdHandler = new Thread(thdstHandler); thdHandler.Start();
} } } }
publicvoid handlerThread() {
Socket handlerSocket = (Socket)alSockets[alSockets.Count - 1]; String streamData = "";
String filename = ""; String[] verbs;
StreamReader quickRead;
NetworkStream networkStream = new NetworkStream(handlerSocket); quickRead = new StreamReader(networkStream);
streamData = quickRead.ReadLine();
verbs = streamData.Split(" ".ToCharArray()); // Assume verbs[0]=GET
filename = verbs[1].Replace("/", "\\"); if (filename.IndexOf("?") != -1) {
// Trim of anything after a question mark (Querystring)
filename = filename.Substring(0, filename.IndexOf("?")); }
if (filename.EndsWith("\\")) {
// Add a default page if not specified
filename += "index.htm"; }
filename = tbPath.Text + filename;
FileStream fs = new FileStream(filename, FileMode.OpenOrCreate); fs.Seek(0, SeekOrigin.Begin);
byte[] fileContents = newbyte[fs.Length]; fs.Read(fileContents, 0, (int)fs.Length); fs.Close();
// optional: modify fileContents to include HTTP header.
handlerSocket.Send(fileContents); lbConnections.Items.Add(filename); handlerSocket.Close();
}