超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
熟悉计算机网络的都知道,HTTP是应用层协议,基于网络传输层协议TCP。具体就不再赘述,下来我们通过具体代码来揭开http协议的神秘面纱:
1. 新建项目,名称HttpResearch,选择Visual C# Console Application(控制台应用程序):
2. 在Main方法中添加如下代码:
static
void
Main(
string
[] args)
{
//前面讲过,HTTP协议是基于TCP/IP协议的,所以这里创建一个TCP协议的Socket实例
Socket
serverSocket =
new
Socket
(
AddressFamily
.InterNetwork,
SocketType
.Stream,
ProtocolType
.Tcp);
serverSocket.Bind(
new
IPEndPoint
(
IPAddress
.Parse(
"192.168.1.86"
), 8888));
//绑定本机的IP和空闲端口
serverSocket.Listen(5);
//开始监听端口
Console
.WriteLine(
"等待TCP连接请求..."
);
var
clientSocket = serverSocket.Accept();
//接收请求
byte
[] buffer =
new
byte
[10240];
//TCP请求读取缓冲
int
receivedBCount = clientSocket.Receive(buffer);
//读取数据,数据为字节流
string
strReceived =
Encoding
.UTF8.GetString(buffer, 0, receivedBCount);
//将字节转成string
clientSocket.Close();
Console
.Write(strReceived);
Console
.Read();
}
3. 运行程序,效果如下:
4. 使用浏览器访问服务绑定的IP和端口:
5. 命令窗口接收到请求并打印出请求体:
至此,我们已经在后台捕获了一个完整的http请求:
GET / HTTP/1.1
Host: 192.168.1.86:8888
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
HTTPS: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Host: 192.168.1.86:8888
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
HTTPS: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
请求头部代表的含义大家可以自行查看相关的标准(
RFC 2616)。
6. 接下来,我们在请求中添加query string,如
7. 我们再来看服务打印出来的请求体,很神奇的事情发生了:
http请求中包含了我们的query string,设想我们在后台把这个字段按照某种格式解析出来,映射到对应的方法,然后给前台返回特定数据。
讲到这里,http请求的神秘面纱就被我们揭开,大家是不是对我们要构造一个web服务器的主题有了更深刻的构想。