本文转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/09/2316745.html

我们学习网络编程最熟悉的莫过于Http,好,我们就从Http入手,首先我们肯定要了解一下http的基本原理和作为,对http的工作原理有

一定程度的掌握,对我们下面的学习都是有很大帮助的。

一: 工作方式

①:client和server建立可靠的TCP连接。

②:然后client通过Socket向server发送http请求。

③:server端处理请求,返回处理数据。

④:在http1.0中,client与server之间的tcp连接立即断开。

但在http1.1中,因为默认支持“tcp的长连接”,所以server端采用超时才断开tcp连接的策略。

二: 特点

①:Http是无状态的,这个相信大家都知道,我就不多说了。

②:client通过在Http请求中的Header里追加一些信息来告诉Server传送的主体的相关信息,比如:主体是什么类型,什么编码。

三:Http请求和响应探究

相信大家都知道常用的请求方式也就是"Get"和“Post”,那么下面就来探究下Get和Post都有哪些好玩的地方,还是上图说话,首先

我输入www.baidu.com,会找到如下的请求和响应的信息。

1: “Request Header“:

第一行: Get / Http/1.1

这里面有三个信息:①"Get",表示请求的模式。 ②“/",请求网站的根目录。  ③"http/1.1",这个就是http的版本。

第二行: Host

请求目标的网站,跟“/"并一起就是"www.baidu.com/"。

第三行: Connection

默认为“keep-Alive“,这里就是文章开头所说的默认支持长连接。

第四行: Cache-Control

这玩意跟缓存有关,其中max-age表示缓存的时间(s)。

第五行:User-Agent

告诉serve我client的身份,一般由浏览器决定,比如:浏览器类型,版本等等。

第六行:Accept

以及后面的Accept打头的都是表明client能够接收的种类和类型。

最后一行:Cookie

如果我们第一次向baidu请求时是没有cookie信息这一栏的,因为在浏览器下找不到于baidu相关的cookie,

当我们第二次刷新页面时,get请求就会找到本地的cookie并附带给server。

2: "Response Header":

第一行: Http/1.1 200 OK

这个估计大家都知道吧,200表示返回的状态码,OK则是描述性的状态码。

第二行:Date

表示服务器响应的时间。

第三行: Server

响应客户端的服务器。

第四行:Content-Length

表示服务器返回给客户端正文的字节流长度。

第五行:Content-Type

表示正文的类型。

第七行:Expires

告诉client绝对的过期时间,比如2012.1.10,在这个时间内client都可以不用发送请求而直接从client的cache中获取,

对js,css,image的缓存很有好处,所以说用好了这个属性对我们http的性能有很大的帮助。

第八行:Content-Encoding

文档类型的编码方式,服务器端采用gzip的形式进行了文档压缩,此时减小了文档,利于下载,但是必须client端支持

gzip的解码操作。

post的方式也是一样的,这里就不说了,上面列举了这么多也是希望大家能够对Http的细节要有一定程度的掌握。

四:应用场景

我们在http上面的网络编程一般主要做两件事情。

①:爬数据,模拟登录,自动填表单。

②:文件的上传和下载。

不过.net对Http进行了非常好的封装,提供了HttpWebRequest和HttpWebResponse来给我们提供常用操作,如果大家对Http协议有个比较

清晰的认识我想类库里面的属性和方法都是神马和浮云。

五 :案例

既然是上篇,就根据“模拟登录”的思想做一个简单的“暴力破解”的小程序,非常简单,呵呵。

第一步: 首先我们写两个action,一个login(登录页面),一个index(用户后台首页)。

 1 namespace Test.Controllers
2 {
3 [HandleError]
4 public class HomeController : Controller
5 {
6 public ActionResult Login()
7 {
8 return View();
9 }
10
11 [HttpPost]
12 public ActionResult Index(Model model)
13 {
14 if (model.UserName == "11" && model.Password == "11")
15 return View(model);
16 else
17 return RedirectToAction("Login");
18 }
19
20 public ActionResult About()
21 {
22 return View();
23 }
24 }
25
26 public class Model
27 {
28 public string UserName { get; set; }
29
30 public string Password { get; set; }
31 }
32 }

好了,我们打开fiddler,输入admin,admin,点击提交,看看都post些什么到server端了,方便我们后面的模拟登录,

这里的head信息相信大家还是能看懂吧。

第二步:我们新建一个winform的程序。

 1 namespace Http  2 {  3     public partial class Form1 : Form  4     {  5         public Form1()  6         {  7             InitializeComponent();  8         }  9  10         private void Form1_Load(object sender, EventArgs e) 11         { 12             //网页内容填充webbrowser1控件 13             string url = "http://localhost:59773/"; 14  15             //创建http链接 16             var request = (HttpWebRequest)WebRequest.Create(url); 17  18             var response = (HttpWebResponse)request.GetResponse(); 19  20             Stream stream = response.GetResponseStream(); 21  22             StreamReader sr = new StreamReader(stream); 23  24             string content = sr.ReadToEnd(); 25  26             webBrowser1.DocumentText = content; 27         } 28  29         /// <summary> 30 /// 暴力破解 31 /// </summary> 32 /// <param name="sender"></param> 33 /// <param name="e"></param> 34         private void button1_Click(object sender, EventArgs e) 35         { 36             var url = "http://localhost:59773/Home/Index"; 37  38             //上一次的返回结果 39             string prev = string.Empty; 40  41             for (int i = 0; i < 100; i++) 42             { 43                 var username = new Random(DateTime.Now.Millisecond).Next(8, 19).ToString(); 44  45                 Thread.Sleep(2); 46  47                 var password = new Random(DateTime.Now.Millisecond).Next(8, 19).ToString(); 48  49                 //post提交的内容 50                 var content = "username=" + username + "&password=" + password; 51  52                 //将content变为字节形式 53                 var bytes = Encoding.UTF8.GetBytes(content); 54  55                 var request = (HttpWebRequest)WebRequest.Create(url); 56  57                 //根据fiddler中查看到的提交信息,我们也试着模拟追加此类信息然后提交 58                 request.Method = WebRequestMethods.Http.Post; 59                 request.Timeout = 1000 * 60; 60                 request.AllowAutoRedirect = true; 61                 request.ContentLength = bytes.Length; 62                 request.ContentType = "application/x-www-form-urlencoded"; 63  64  65                 //将content写入post请求中 66                 var stream = request.GetRequestStream(); 67                 stream.Write(bytes, 0, bytes.Length); 68                 stream.Close(); 69  70                 //写入成功,获取请求流 71                 var response = (HttpWebResponse)request.GetResponse(); 72  73                 var sr = new StreamReader(response.GetResponseStream()); 74  75                 var next = sr.ReadToEnd(); 76  77                 if (string.IsNullOrEmpty(prev)) 78                 { 79                     prev = next; 80                 } 81                 else 82                 { 83                     if (prev != next) 84                     { 85                         webBrowser2.DocumentText = next; 86                         MessageBox.Show("恭喜你,密码已经破解!一共花费:" + (i + 1) + "次,用户名为:" + username + ",密码为:" + password); 87                         return; 88                     } 89                 } 90  91             } 92             webBrowser2.DocumentText = "不好意思,未能破解"; 93         } 94     } 95 }

第三步:我们现在要做的就是点击”暴力破解”,看看能不能给我枚举出来“肉鸡网站”的用户名和密码。

呵呵,现实中远不止这么简单,主要还是想让大家能够对HttpWebReqeust和HttpWebResponse有个了解。

 
 

[转]12篇学通C#网络编程——第二篇 HTTP应用编程(上)的更多相关文章

  1. 12篇学通C#网络编程

    转自:http://www.cnblogs.com/huangxincheng/archive/2012/01/03/2310779.html 在C#的网络编程中,进程和线程是必备的基础知识,同时也是 ...

  2. 网络编程[第二篇]基于udp协议的套接字编程

    udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息, ...

  3. 前端学PHP之面向对象系列第二篇——魔术方法

    × 目录 [1]构造方法 [2]析构方法 [3]不可访问属性[4]对象复制[5]字符串[6]对象不存在[7]自动加载类[8]串行化[9]函数调用 前面的话 php在面向对象部分有很多相关的魔术方法,这 ...

  4. PLC状态机编程第二篇-负载均衡

    控制任务 大家好,今天我们用状态机描述稍复杂的实例,同时用LAD和ST语言写状态机.我们的控制任务如下: 真空泵A和真空泵B, 按下启动按钮后, 泵A启动, 3秒后泵B也启动, 此时泵A仍运行, 当容 ...

  5. SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka篇

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  6. ElasticSearch查询 第二篇:文档更新

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  7. 24小时学通Linux内核总结篇(kconfig和Makefile & 讲不出再见)

    非常开心能够和大家一起分享这些,让我受益匪浅,感激之情也溢于言表,,code monkey的话少,没办法煽情了,,,,,,,冬天的风,吹得伤怀,倒叙往事,褪成空白~学校的人越来越少了,就像那年我们小年 ...

  8. 网络版shell之网络编程练习篇--telnet服务端

    网络版shell之网络编程练习篇--telnet服务端   以前写过一个shell命令解释器,对与shell命令解释器的执行流程有了清晰的认识,这段时间学习网络编程,至于网络编程的细节以及知识点,已经 ...

  9. 21天学通PythonPDF高清完整版免费下载|百度云盘

    百度云盘:21天学通PythonPDF高清完整版免费下载 提取码:nqa9 豆瓣评分: 书籍封面: 内容简介  · · · · · · <21天学通Python>全面.系统.深入地讲解了P ...

随机推荐

  1. windows的IIS下的负载均衡

    来自http://www.cnblogs.com/allen0118/p/4294066.html 在大型Web应用系统中,由于请求的数据量过大以及并发的因素,导致Web系统会出现宕机的现象,解决这一 ...

  2. 用css计算选中的复选框有几个

    上代码: <!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>计数< ...

  3. Slideout.js – 触摸滑出式 Web App 导航菜单

    Slideout.js 是为您的移动 Web 应用开发的触摸滑出式的导航菜单.它没有依赖,自由搭配简单的标记,支持原生的滚动,您可以轻松地定制它.它支持不同的 CSS3 转换和过渡.最重要的是,它只是 ...

  4. 送给我的朋友——Cry on my shoulder

    If the hero never comes to you如果你的真命天子仍未来到 If you need someone you"re feeling blue如果你情绪低落需要有人陪伴 ...

  5. sharepoint2013的最少下载策略概述(MDS)

    该策略是 SharePoint 2013 中的一种新功能,通过在用户导航到新页面时仅发送差异内容来减少页面加载时间. 最少下载策略 (MDS) 是 SharePoint 2013 中的一种新技术,可减 ...

  6. 免费真机调试 -- Xcode7

    刚新安装了Xcode7 Version 7.1 beta , 据说这个版本可以免费真机调试,于是用了一个新的AppID测试了,发现真的可以免费真机调试了呢!新的appId账号,没有支付每年的99美刀, ...

  7. Android 字符乱码问题的处理

    <Android 网络HTML查看器>一文中,运行代码实践一下 发现html源代码中出现了乱码,原因很明显:charset="gb2312" android默认的字符集 ...

  8. 安装docker后,VMware网络无法访问了,VMware重置网络设置

    1.vmware虚拟机处于关闭状态 2.vmware程序->edit(编辑)-->左下角 "Restore Default"恢复默认设置         [恢复]完成后 ...

  9. Microsoft.Owin.Hosting 实现启动webapp.dll

    Microsoft.Owin.Hosting 下面是 asp.net core 实现 using System;using System.Collections.Generic;using Syste ...

  10. sqlserver删除所有表(表结构和数据)

    要删除某个数据库,或者删除数据库中的所有表(删除表结构和数据),需要先删除表间的外键约束,才能删除表.如删除数据库db_wy中的所有表: --/第1步**********删除所有表的外键约束***** ...