• 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相关协议的各种知识滴呀;

  • 相关阅读:
    一、ThinkPHP的介绍
    一、ThinkPHP的介绍
    perl 爬虫两个技巧
    perl 爬虫两个技巧
    perl 爬取上市公司业绩预告
    perl lwp get uft-8和gbk
    perl lwp get uft-8和gbk
    perl 爬取同花顺数据
    perl 爬取同花顺数据
    php 接口示例
  • 原文地址:https://www.cnblogs.com/mc67/p/6229965.html
Copyright © 2020-2023  润新知