http协议原理(www服务响应过程)响应细节,报文细节

首次发布:2019-03-10 17:46

请求报文和响应报文的结构实例



起始行一般包含http版本号,数字状态码,状态情况 
而数字状态码,常见有以下几种 
200 代表ok 
301 永久跳转 
403 没权限 
404 没有这个文件 
500 未知的错误 
502 网关错误 
503 服务器超载,停机维护 
504 网关超时 
响应头部,主要包括,服务器的web软件版本,服务器时间,长连接还是短连接,设置字符集等等 
这里的空行和请求报文空行一样



HTTP/1.1规范定义了如下47种首部字段



以下是一个C# 代码实例

        /// <summary>
        /// 获取html 代码  
        /// </summary>
        /// <param name="ip">如 42.51.12.85</param>
        /// <param name="prot">如 80</param>
        /// <param name="url">如 www.luofenming.com</param>
        /// <returns></returns>
        private string GetHtml(string ip, string prot, string url)
        {
            Socket socket = CreateSocket(ip, prot);
            try
            {
                StringBuilder sb = new StringBuilder();//发送的请求报文
                sb.AppendLine("GET / HTTP/1.1");
                sb.AppendLine("Accept: */*");
                sb.AppendLine("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; )");
                sb.AppendLine("Host: " + url);
                sb.AppendLine("Connection: Keep-Alive\r\n\r\n");//注意发送的字符串 后面有两个回车换行
                byte[] data = System.Text.Encoding.Default.GetBytes(sb.ToString());
                socket.Send(data);

                byte[] rData = new byte[500 * 1024];
                socket.Receive(rData);
                string rs = Encoding.GetEncoding("UTF-8").GetString(rData);//编码类型如  UTF-8 或 GB2312 等
                return rs;
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
            finally
            {
                socket.Close();
                socket.Dispose();
            }
        }
        /// <summary>
        /// 创建Scoket 客户端
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="prot"></param>
        /// <returns></returns>
        public Socket CreateSocket(string IP, string prot)
        {
            //定义一个套接字用于监听客户端发来的信息  包含3个参数(IP4寻址协议,流式连接,TCP协议)
            Socket socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //发送信息 需要1个IP地址和端口号
            IPAddress ipaddress = IPAddress.Parse(IP); //获取文本框输入的IP地址
                                                       //将IP地址和端口号绑定到网络节点endpoint上 
            IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(prot)); //获取文本框上输入的端口号
                                                                              //向指定的ip和端口号的服务端发送连接请求 用的方法是Connect 不是Bind
            socketClient.Connect(endpoint);
            return socketClient;
        }