这对象很简单,封装很多常用的方法和属性;使用起来也很方便;
这个关键是要对我们的 http中的各种协议要很了解滴呀;
模拟一个简单的暴力破解:
public static class HttpInfo { public static void Attack() { string url = ""; var request=(HttpWebRequest)WebRequest.Create(url); //请求对象滴滴呀 var response = (HttpWebResponse)request.GetResponse(); //得到响应对象; Stream stream = response.GetResponseStream(); //得到这个响应流滴呀; StreamReader read = new StreamReader(stream); //流转化; string content = read.ReadToEnd(); //这样就得到我们的响应的文本信息了滴呀; } //然后这个就是我们的暴力破解的代码; public static void VoilteFuck() { string url = "http://localhost:3837/Login/index"; string pre = string.Empty; for(int i = 0; i < 100; i++) { Console.WriteLine("破解进行中..."); Thread.Sleep(300); var userName = new Random(DateTime.Now.Millisecond).Next(8,19).ToString(); //这里要添加一个我们的seed来提 var PassWord = new Random(DateTime.Now.Millisecond).Next(8,19).ToString(); var PostInfo = "UserName="+userName+ "&PassWord="+ PassWord; var bytes = Encoding.UTF8.GetBytes(PostInfo);//将我们的额content变成字节的形式; var request = (HttpWebRequest)WebRequest.Create(url); //根据fidller中看到的信息,我们可以模拟追加这样的信息; request.Method = WebRequestMethods.Http.Post; request.Timeout = 1000 * 60; request.AllowAutoRedirect = true; request.ContentLength = bytes.Length; request.ContentType = "application/x-www-form-urlencoded"; //将我们的content写入post请求; var stream = request.GetRequestStream(); stream.Write(bytes,0,bytes.Length); stream.Close(); var response = (HttpWebResponse)request.GetResponse(); //然后成功的写入到我们的响应流中滴呀; //获取请求的值; var sr = new StreamReader(response.GetResponseStream()); var currentContext = sr.ReadToEnd(); if (string.IsNullOrEmpty(pre)) { pre = currentContext; }else { if (pre != currentContext) //这种判断是不太精确的,应为;mvc中有一个EnableBrowserLink,想page中插入随机js代码;所以,算了,这只是一个简单的模拟; { Console.WriteLine("第{0}次之后,破解成功,破解成功,破解成功,账户是:{1},密码是:{2}", i,userName, PassWord); break; } else { Console.WriteLine("第{0}次,账户是:{1},密码是:{2}", i, userName, PassWord); } } } Console.WriteLine("尝试完毕!"); } } }
上面是向我们的service端不断的post提交东西,接下来我们尝试从service download一些信息;
先尝试我们的额单线程模式
//通过http,开启多个线程,来下载我们想要额基本东西滴呀; public static class DownInfo { //这个是学习http的一个很好的实例滴呀; //每个线程下载的字节数,方便我们最后的合并滴啊 public static ConcurrentDictionary<long, byte[]> dic = new ConcurrentDictionary<long, byte[]>(); // http://imgsrc.baidu.com/baike/pic/item/dc854fda6c02ee8db7fd4805.jpg public static string ResourceUrl = "http://www.pncity.net/bbs/data/attachment/forum/201107/30/1901108yyd8gnrs2isadrr.jpg"; //启用单线程的方式来进行下载 public static void RunSingle() { Stopwatch watch = new Stopwatch(); watch.Start(); Console.Write("下载开始......"); if (GetHead() == 0) { return; } var request = (HttpWebRequest)HttpWebRequest.Create(ResourceUrl); var response = (HttpWebResponse)request.GetResponse(); var stream = response.GetResponseStream();//得到我们额响应流滴呀 var MStream = new MemoryStream(); //这使用我们的内存流滴呀; var bytes = new byte[10240]; int count = 0; while((count=stream.Read(bytes,0,bytes.Length))!=0) { MStream.Write(bytes,0,count); //写入到我们的内存流中滴呀; } //然后存到我们的本地中; var name = ResourceUrl.Substring(ResourceUrl.LastIndexOf('/') + 1); var target = @"F:\xiandao_person\"+name; FileStream fs = new FileStream(target,FileMode.Create,FileAccess.ReadWrite);//其他信息: 对路径“F:xiandao_person”的访问被拒绝。(没有添加文件名导致的,就是我们的name滴呀;) fs.Write(MStream.ToArray(),0,(int)MStream.Length); MStream.Close(); response.Close(); watch.Stop(); Console.WriteLine("下载结束,单线程下载耗时:{0}",watch.Elapsed); //好的,这下我们的图片下载就基本结束了, } //获取响应头的信息滴呀; private static long GetHead() { var request = HttpWebRequest.Create(ResourceUrl); request.Method = "Head"; request.Timeout = 3000; var response =(HttpWebResponse)request.GetResponse(); var code = response.StatusCode; if (code != HttpStatusCode.OK) { Console.WriteLine("下载资源无效!"); return 0; } var total = response.ContentLength; Console.WriteLine("当前资源大小为:"+total); response.Close(); return total; } //顺便复习一下常见流的操作滴呀; private static void Read() { string url = @""; FileStream fs = new FileStream(url,FileMode.Open,FileAccess.Read); byte[] by = new byte[fs.Length]; fs.Read(by,0,(int)fs.Length);//将我们的数据读入我们的by字节数组中滴呀; } //文件的写入操作的啊; private static void Write(string val) { byte[] buffer = Convert.FromBase64String(val); string path = @""; FileStream fs = new FileStream(path,FileMode.Create); fs.Write(buffer,0,buffer.Length); fs.Flush(); fs.Close(); } }
接下来就来尝试我们的多线程模式滴 ;
//后面我们考虑,使用并发编程来进行下载的呀,同样提高效率滴呀;不,并发编更多的是用在本地计算中的; //多线程来进行请求,然后拼接在一起,这个是一个很不错的实例和使用方式滴呀;,效果很不错
public static CountdownEvent cde = new CountdownEvent(0);
public static ConcurrentDictionary<long, byte[]> dic = new ConcurrentDictionary<long, byte[]>();
public static string ResourceUrl = "http://www.pncity.net/bbs/data/attachment/forum/201107/30/1901108yyd8gnrs2isadrr.jpg"
public static void RunMultiTask() { Stopwatch watch = Stopwatch.StartNew(); Console.Write("下载开始......"); int threadCount = 5; long start = 0; long end = 0; var total = GetHead(); if (total == 0) { return; } int pageSize = (int)Math.Ceiling((double)total / threadCount);//“每一页”的大小 cde.Reset(threadCount); Task[] task = new Task[threadCount]; for(var i = 0; i < threadCount; i++) { start = i * pageSize; end = (i + 1) * pageSize - 1; //因为,小标是从0开始的,所以这里要减去一滴呀; if (end > total) end = total; var obj = start + "|" + end; task[i] = Task.Factory.StartNew(j=> DownTaskMulti(obj),obj); } Task.WaitAll(task); var name = ResourceUrl.Substring(ResourceUrl.LastIndexOf('/')+1); var path = @"F:\xiandao_person\" + name; FileStream fs = new FileStream(path,FileMode.Create,FileAccess.ReadWrite); var result = dic.Keys.OrderBy(i=>i).ToList(); //保证顺序滴啊; foreach(var item in result) { fs.Write(dic[item],0,dic[item].Length); //写入到本地中; } fs.Close(); watch.Stop(); Console.WriteLine("下载结束,启动{0}个线程,耗时{1}", threadCount,watch.Elapsed); } /// <summary> /// 多线程来进行请求,然后拼接在一起,这个是一个很不错的实例和使用方式滴呀;,效果很不错 /// </summary> /// <param name="obj"></param> private static void DownTaskMulti(object obj) { var single = obj.ToString().Split('|'); long start = Convert.ToInt64(single.FirstOrDefault()); long end = Convert.ToInt64(single.LastOrDefault()); var request = (HttpWebRequest)HttpWebRequest.Create(ResourceUrl); request.AddRange(start, end); //每次仅仅请求获取制定位置的数据滴呀;,这样的效果还是挺不错滴呀; //向请求添加指定范围的字节范围标头。 // // 参数: // from: // 开始发送数据的位置。 // // to: // 停止发送数据的位置 var response = (HttpWebResponse)request.GetResponse(); var stream = response.GetResponseStream(); var ms = new MemoryStream(); var bytes = new byte[10240]; //每次取出这么多个字节 int count = 0; while ((count=stream.Read(bytes,0,bytes.Length))!=0) { ms.Write(bytes,0,count); //写入我们的额内存流中; } ms.Close(); response.Close(); dic.TryAdd(start,ms.ToArray()); cde.Signal(); }
这里有个Task的使用和我们CountdownEvent 的使用滴呀;这个要注意复习和使用滴呀;
这里还要注意复习和了解我们http相关协议的各种知识滴呀;