HTTP协议
一,HTTP简述。
HTTP是用于从WWW服务器传输超文本到本地浏览器的传送协议。基于C/S模式。
假设访问www.baidu.com。
1.在浏览器地址栏输入网址www.baidu.com。
2.此时只有域名没有IP地址,所以想DNS(域名服务器)发送DNS数据包,服务器响应返回百度的IP地址。
3.假设,回传的地址是66.111.123.111,那么浏览器就向66.111.123.111的主机的端口80发送一条TCP连接请求
4.连接成功后,浏览器发出一条HTTP请求, 如 GET http://www.baidu.com/ HTTP/1.1
5.当域名为www.baidu.com的服务器接受到请求后,向浏览器发送一个html文件
6.文件发送完后,服务器主动关闭TCP连接。
7.浏览器接受传来的页面并显示。
8.如果html文件中含有图片,将再与服务器连接,用于下载图片。
二,HTTP请求(第四步中的请求)
http请求由三个部分组成 1.请求行:(请求方式 URL HTTP版本号)。
2.请求头:一些信息的设置。
3.响应数据:发送的一些数据内容。
请求内容 URL HTTP版本号
请求头信息
<一个空行>
请求数据
从数据中可以看出,请求方式是GET,则没有请求数据,只有请求行和请求头
使用了POST方法,所以加上了请求的数据(图中Body部分)。
下面介绍下各个部分。
三.HTTP请求方式。
| 方法 | 描述 |
| Get | 返回URL所指的文档,一般用来请求下载Web网页 |
| Head | 请求文档头,它类似Get方法,只是Web服务器返回指定文档的首部信息 |
| Post | 它与Get方法相反,请求服务器接受指定文档,但它不替换已有的文档,只是将新数据附加在它的后面(例如用户密码验证,可以将数据写在请求数据中) |
| Put | 它与Get方法类似,用从客户端传送的数据取代指定文档中的内容,使客户可以向远程Web服务器传送网页等文件 |
| Delete | 请求服务器删除指定的页面 |
| Options | 允许客户端查看服务器的性能 |
| Trace | 用于测试允许客户端查看的消息回收过程 |
四.HTTP请求头信息。
|
五.HTTP的响应--当上述的HTTP请求发送到服务器端,服务器会返回一个响应,响应也由三部分组成。
状态行---以HTTP版本号开始,后面跟3个数字,代表响应码,用于告诉客户端,服务器产生何种响应。
响应头---
<空一行>
响应数据
| HTTP /1.1 200 OK Date: Apr 11 2006 15:32:08 GMT Server: Apache/2.0.46(win32) Content-Length: 119 Content-Type: text/html <HTML> <HEAD> <LINK REL="stylesheet" HREF="index.css"> </HEAD> <BODY> <IMG SRC="image/logo.png"> </BODY> </HTML> |
在状态行中,响应码有多种,如下所示

HTTP响应头用于服务器向客户端提供请求文档信息或服务端的状态信息,如图:

六. NET中的HTTP编程。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace TcpWebserver
{
class Program
{
static void Main(string[] args)
{
// 获得本机的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();
}
}
}

被折叠的 条评论
为什么被折叠?



