源码下载: http://download.csdn.net/detail/kingmax54212008/9910988
实现自定义的Web服务器
简介该示例实现一个自定义的Web服务器,该服务监听浏览器发出的Http请求,该服务器只对49155端口进行监听,当在浏览器输入http://localhost:41955/,此时服务器会响应该请求,并向输出Welcome you字符串作为响应;并且在服务器的界面中我们可以看到Http请求的详细信息
简介
为了简化网络编程,.net对套接字又进行了一次封装,封装后的类是在System.Net.Sockets命名空间下的TcpListener类和TcpClient类,使用TcpListener类用来监听和接收传入的连接请求,在该类的构造函数中只需要传递一组网络端点信息就可以准备好监听参数,而不需要设置使用的网络协议等细节,调用Start方法后,监听工作就开始(间接调用了Socket.Listen方法),AcceptTcpClient方法将阻塞进程,直到一个客户端发来连接请求为止,这个方法返回一个封装了Socket的TcpClient对象,同时从传入的连接队列中删除该客户端的连接请求。此时通过这个TcpClient对象与客户端进行通信。
该示例实现一个自定义的Web服务器,该服务监听浏览器发出的Http请求,该服务器只对49155端口进行监听,当在浏览器输入http://localhost:41955/,此时服务器会响应该请求,并向输出Welcome you字符串作为响应;并且在服务器的界面中我们可以看到Http请求的详细信息。
运行示例
第一步、打开“WebServer.sln”文件来打开整个解决方案,然后按F5或按Ctrl+F5来运行该示例,此时你将看到下面的界面:
第二步、在打开IE浏览器,在地址栏输入http://localhost:49155/,此时可以在浏览器中看到下面的结果。
第三步、然后我们回到Web服务器程序中,我们将看到下面的输出信息
使用代码
第一步、用Visual Studio创建一个控制台应用程序。
第二步、在控制台应用程序中加入额外的命名空间
using System.Net;
using System.Net.Sockets;
// 获得本机的Ip地址,即127.0.0.1
IPAddress localaddress = IPAddress.Loopback;
// 创建可以访问的断点,49155表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲的端口号
IPEndPoint endpoint = new IPEndPoint(localaddress, 49155);
// 创建Tcp 监听器
TcpListener tcpListener = new TcpListener(endpoint);
// 启动监听
tcpListener.Start();
Console.WriteLine("Wait an connect Request...");
while (true)
{
// 等待客户连接
TcpClient client = tcpListener.AcceptTcpClient();
if (client.Connected == true)
{
// 输出已经建立连接
Console.WriteLine("Created connection");
}
// 获得一个网络流对象
// 该网络流对象封装了Socket的输入和输出操作
// 此时通过对网络流对象进行写入来返回响应消息
// 通过对网络流对象进行读取来获得请求消息
NetworkStream netstream = client.GetStream();
// 把客户端的请求数据读入保存到一个数组中
byte[] buffer = new byte[2048];
int receivelength = netstream.Read(buffer, 0, 2048);
string requeststring = Encoding.UTF8.GetString(buffer, 0, receivelength);
// 在服务器端输出请求的消息
Console.WriteLine(requeststring);
// 服务器端做出相应内容
// 响应的状态行
string statusLine = "HTTP/1.1 200 OK\r\n";
byte[] responseStatusLineBytes = Encoding.UTF8.GetBytes(statusLine);
string responseBody = "<html><head><title>Default Page</title></head><body><p style='font:bold;font-size:24pt'>Welcome you</p></body></html>";
string responseHeader =
string.Format(
"Content-Type: text/html; charset=UTf-8\r\nContent-Length: {0}\r\n", responseBody.Length);
byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody);
// 写入状态行信息
netstream.Write(responseStatusLineBytes, 0, responseStatusLineBytes.Length);
// 写入回应的头部
netstream.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
// 写入回应头部和内容之间的空行
netstream.Write(new byte[] { 13, 10 }, 0, 2);
// 写入回应的内容
netstream.Write(responseBodyBytes, 0, responseBodyBytes.Length);
// 关闭与客户端的连接
client.Close();
Console.ReadKey();
break;
}
// 关闭服务器
tcpListener.Stop();