C#网络编程日记5

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请求头信息。

 

  1. User-Agent  //客户端厂家和版本,eg:Mozilla /5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3  
  2. Accept  //客户端可识别的内容类型列表,eg:text /html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  
  3. Accept-Language //接收语言,eg:zh- cn,zh;q=0.5  
  4. Accept-Encoding //接收压缩方式,eg:gzip,deflate  
  5. Accept-Charset //接收编 码,eg:GB2312,utf-8  
  6. Keep-Alive //客户端到服务器端的连接持续有效  
  7. Connection //链接方式,eg:keep-alive  
  8. Cookie //  
  9. Cache-Control //控制HTTP缓存  
  10. Referer //请求的来源页面  
  11. Host //请求主机  
  12. Authorization //页面验证  
  13. //POST时  
  14. Content-Type //数据或文件的类型  
  15. Content-Length    //附加到请求的数据字节数 

五.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();  
        }  
    }  
}  


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值