zoukankan      html  css  js  c++  java
  • socket,获取html,webservice等,支持chunked,gzip,deflate

    1. [代码][C#]代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    using System.Net;
    using System.IO;
    using System.IO.Compression;
    using System.Reflection;
     
    namespace ConsoleApplication1
    {
        internal class user
        {
            public string content { get; set; }
            public string mdpass { get; set; }
            public string mobile { get; set; }
            public string name { get; set; }
            public string pass { get; set; }
            public string ptimestamp { get; set; }
            public string sendPort { get; set; }
            public string sendTime { get; set; }
            public string title { get; set; }
        }
     
        class Program
        {
            static void Main(string[] args)
            {
               
                Console.WriteLine("********WebService Testing!*******");
                HttpHelper http = new HttpHelper();
                Dictionary<string, string> dics = new Dictionary<string, string>();
                user bean = new user();
                bean.name = "122";
                bean.pass = "21";
                bean.ptimestamp = "20121109111950";
                bean.content = "测试";
                bean.mobile = "13432033335";
                bean.sendPort = "";
                bean.sendTime = "";
                bean.mdpass = "4CC4122226B23F75EDE78";
     
     
     
                http.NameSpace = "http://*.*.*.*:8080//sms";
                http.WEncoding = Encoding.UTF8;
                Console.WriteLine(http.GetWebServiceStr("http://124.****:8080//sms",
                  "SendSMS", http.CreateSoap(bean)));
                Console.WriteLine("*********Get Testing!***********");
                http.WEncoding = Encoding.UTF8;
                http.IniStalling();
                Console.WriteLine(http.MethodGetHttpStr("http://*.*.*.*:8080/smshttp?"));
                Console.WriteLine("*********Post Testing!**********");
                http.WEncoding = Encoding.UTF8;
                http.IniStalling();
                Console.WriteLine(http.MethodPostHttpStr("http://*.*.*.*:8080/smshttp?act=getbalance", ""));
                Console.ReadLine();
            }
        }
     
        /// <summary>
        /// socket核心
        /// </summary>
        internal class HttpHelper
        {
            public HttpHelper()
            {
                IniStalling();
            }
            public void IniStalling()
            {
                HttpHeaders = new List<HttpHeaderModel>();
                ResponseHttpHeaders = new List<HttpHeaderModel>();
                DicCookies = new List<CookiesModel>();
                AddHttpHeader("Accept", "*/*");
                AddHttpHeader("Accept-Language", "zh-CN");
                AddHttpHeader("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)");
                AddHttpHeader("UA-CPU", "AMD64");
                AddHttpHeader("Connection", "Keep-Alive");
            }
     
            public Encoding WEncoding = Encoding.UTF8;
            /// <summary>
            /// 请求或者返回的头文件
            /// </summary>
            internal class HttpHeaderModel
            {
                public string Key { get; set; }
                public string Value { get; set; }
            }
            /// <summary>
            /// get,post的cookies
            /// </summary>
            internal class CookiesModel
            {
                public string Key { get; set; }
                public string Value { get; set; }
                public string Domain { get; set; }
            }
            internal List<HttpHeaderModel> HttpHeaders = new List<HttpHeaderModel>();
            internal List<HttpHeaderModel> ResponseHttpHeaders = new List<HttpHeaderModel>();
            internal List<CookiesModel> DicCookies = new List<CookiesModel>();
            /// <summary>
            /// 添加HTTP头
            /// </summary>
            /// <param name="key"></param>
            /// <param name="value"></param>
            public void AddHttpHeader(string key, string value)
            {
                foreach (HttpHeaderModel httpHeaderModel in HttpHeaders)
                {
                    if (httpHeaderModel.Key == key)
                    {
                        httpHeaderModel.Value = value;
                        return;
                    }
                }
                HttpHeaders.Add(new HttpHeaderModel()
                {
                    Key = key,
                    Value = value
                });
            }
     
     
     
            public string MethodGetHttpStr(string url)
            {
     
                return GetHttpByte(url, null);
            }
     
            public string MethodPostHttpStr(string url, string data)
            {
     
                return GetHttpByte(url, data);
            }
     
            /// <summary>
            /// 设置命名空间,请在地址后面加上wsdl获取。
            /// </summary>
            public string NameSpace { get; set; }
     
            private int index = 0;
            public string CreateSoap(object obj)
            {
                StringBuilder sb = new StringBuilder();
                Type tType = obj.GetType();
                PropertyInfo[] pInfos = tType.GetProperties();
                sb.AppendLine("<test" + index + " xsi:type="m" + index + ":" + tType.Name + "">");
                foreach (PropertyInfo pInfo in pInfos)
                {
                    sb.AppendLine(string.Format(" <{0}>{1}</{0}>", pInfo.Name, pInfo.GetValue(obj, null)));
                }
                sb.AppendLine("</test" + index + ">");
                index++;
                return sb.ToString();
            }
     
            public string CreateSoap(Dictionary<string, string> MethodParms)
            {
                StringBuilder sb = new StringBuilder();
                foreach (KeyValuePair<string, string> keyValuePair in MethodParms)
                {
                    sb.AppendLine(string.Format(" <{0}>{1}</{0}>", keyValuePair.Key, keyValuePair.Value));
                }
                return sb.ToString();
            }
     
            public string GetWebServiceStr(string url, string MethodName, string soap)
            {
                index = 0;
                if (string.IsNullOrEmpty(NameSpace))
                    throw new MissingFieldException("请输入NameSpace");
                if (url.Contains("asmx"))
                    AddHttpHeader("SOAPAction", """ + NameSpace.TrimEnd('/') + "/" + MethodName + """);
     
                else
                    AddHttpHeader("SOAPAction", """");
     
                AddHttpHeader("Content-Type", "text/xml; charset=utf-8");
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("<?xml version="1.0" encoding="utf-8"?>");
                sb.AppendLine("<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">");
                sb.AppendLine("<soap:Body>");
                sb.AppendLine(string.Format("<" + MethodName + " xmlns="" + NameSpace + "">"));
                sb.Append(soap);
                sb.AppendLine(string.Format("</" + MethodName + ">"));
                sb.AppendLine("</soap:Body>");
                sb.AppendLine("</soap:Envelope>");
                return MethodPostHttpStr(url, sb.ToString());
            }
     
            public string GetHttpByte(string url, string data = "")
            {
                bool methodPost = !string.IsNullOrEmpty(data);
                if (methodPost)
                {
                    byte[] sendBytes = WEncoding.GetBytes(data);
                    AddHttpHeader("Content-Length", sendBytes.Length.ToString());
                }
                string cookies =
                    DicCookies.Aggregate(string.Empty,
                    (current, cookie) => current + string.Format("{0}:{1};", cookie.Key, cookie.Value));
                string[] urlspils = url.Replace("http://", "").Split('/');
                string host = urlspils[0];
                string methodurl = url.Replace("http://", "").Remove(0, host.Length);
                string[] ipport = host.Split(':');
                string ip = "127.0.0.1";
                string post = "80";
                if (ipport.Length > 1)
                {
                    host = ipport[0];
                    post = ipport[1];
                }
                IPAddress[] addressList = Dns.GetHostAddresses(host);
     
                if (addressList.Length > 0)
                {
                    ip = addressList[0].ToString();
                }
     
                Socket httpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint serverHost = new IPEndPoint(IPAddress.Parse(ip), int.Parse(post));
     
                StringBuilder httpHeader = new StringBuilder();
                httpHeader.Append((methodPost ? "POST" : "GET") + " " + methodurl + " HTTP/1.1 ");
                AddHttpHeader("Host", host);
                if (!string.IsNullOrEmpty(cookies))
                    AddHttpHeader("Cookie", cookies);
                foreach (var item in HttpHeaders)
                {http://www.huiyi8.com/hunsha/lifu/
                    httpHeader.Append(string.Format("{0}: {1} ", item.Key, item.Value));
                }婚纱礼服欣赏
                string httpData = string.Format("{0} {1}", httpHeader, data);
                Console.WriteLine(httpData);
                try
                {
                    httpSocket.Connect(serverHost);
                    if (!httpSocket.Connected)
                        throw new WebException("连接不上服务器");
                    byte[] bytesSend = WEncoding.GetBytes(httpData);
     
                    #region Socket
     
                    //httpSocket.Send(bytesSend);
     
                    //byte[] bytesReceive = new byte[8192];
                    //string getresult = string.Empty;
                    //while (true)
                    //{
                    //    int receiveLen = httpSocket.Receive(bytesReceive, bytesReceive.Length, SocketFlags.None);
                    //    getresult += WEncoding.GetString(bytesReceive, 0, receiveLen);
                    //    if ((receiveLen) == 0 || receiveLen < bytesReceive.Length)
                    //        break;
                    //    Thread.Sleep(10);
                    //}
                    //return getresult;
     
                    #endregion
     
                    #region networkstrem
     
                    using (var stream = new NetworkStream(httpSocket))
                    {
                        stream.Write(bytesSend, 0, bytesSend.Length);
                        while (true)
                        {
                            var line = ReadLine(stream);
                            if (line.Length == 0)
                                break;
     
                            if (line.Contains("HTTP/1.1"))
                                continue;
     
                            int index = line.IndexOf(':');
                            ResponseHttpHeaders.Add(new HttpHeaderModel()
                                                        {
                                                            Key = line.Substring(0, index),
                                                            Value = line.Substring(index + 2)
                                                        });
                        }
                        Stream responseStream = stream;
                        bool ischunked = GetFromResponseHeader("Transfer-Encoding").Count == 1;
                        List<string> conlengt = GetFromResponseHeader("Content-Length");
                        long contentlenght = 0;
                        if (conlengt.Count > 0)
                            contentlenght = long.Parse(conlengt[0]);
                        List<string> contentEncodings = GetFromResponseHeader("Content-Encoding");
                        if (contentEncodings.Count == 1)
                        {
                            if (contentEncodings[0].Equals("gzip"))
                            {
                                responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
                            }
                            else if (contentEncodings[0].Equals("deflate"))
                            {
                                responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);
                            }
                        }
                        if (ischunked)
                        {
                            StringBuilder sbReadstr = new StringBuilder();
     
                            //  var respBuffer = new byte[contentlenght + 1024];
                            int readlinecount = 1;
                            while (true)
                            {
                                var line = ReadLine(responseStream);
                                int lenght = 0;
                                if (readlinecount % 2 == 0)
                                {
                                    sbReadstr.AppendLine(line);
                                }
                                else if (line.Length == 1 && int.TryParse(line, out lenght) && readlinecount % 2 == 1 && readlinecount != 1)
                                {
                                    if (lenght == 0)
                                        break;
                                }
                                readlinecount++;
                            }
                            //var strbytes = WEncoding.GetBytes(sbReadstr.ToString());
                            //memStream.Write(strbytes, 0, strbytes.Length);
                            return sbReadstr.ToString();
                        }
                        else
                        {
                            var respBuffer = new byte[contentlenght + 1024];
     
                            try
                            {
                                int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length);
                                {
                                    return WEncoding.GetString(respBuffer, 0, bytesRead);
                                }
                            }
                            finally
                            {
                                responseStream.Close();
                            }
                        }
                    }
     
                    #endregion
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (httpSocket.Connected)
                        httpSocket.Close();
                }
            }
            public List<string> GetFromResponseHeader(string key)
            {
                return (from item in ResponseHttpHeaders where item.Key == key select item.Value).ToList();
            }
     
            string ReadLine(Stream stream)
            {
                var lineBuffer = new List<byte>();
                while (true)
                {
                    int b = stream.ReadByte();
                    if (b == -1)
                    {
                        return null;
                    }
                    if (b == 10)
                    {
                        break;
                    }
                    if (b != 13)
                    {
                        lineBuffer.Add((byte)b);
                    }
                }
                return WEncoding.GetString(lineBuffer.ToArray());
            }
        }
     
        internal class httpNetHelper
        {
     
            public string CreateGetString(string geturl)
            {
                return GetHtml(geturl);
            }
            public string CreatePostString(string posturl, string date)
            {
                return GetHtml(posturl, Encoding.UTF8.GetBytes(date));
            }
            private String userAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E)";
            private String accept = "*/*";
            public String contentType = "application/x-www-form-urlencoded; charset=UTF-8";
            /// <summary>
            /// 从响应获得字符串
            /// </summary>
            /// <param name="url"></param>
            /// <param name="data"></param>
            /// <returns></returns>
            internal string GetHtml(string url, byte[] data = null)
            {
                using (var response = GetResponse(url, data))
                {
                    using (var stream = response.GetResponseStream())
                    {
                        using (var sr = new StreamReader(stream, Encoding.UTF8))
                        {
                            return sr.ReadToEnd();
                        }
                    }
                }
            }
            internal HttpWebResponse GetResponse(string url, byte[] data = null)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
                request.UserAgent = userAgent;
                request.Accept = accept;
                if (data != null)
                {
                    request.Method = "POST";
                    request.ContentLength = data.Length;
                    using (var stream = request.GetRequestStream())
                    {
                        stream.Write(data, 0, data.Length);
                    }
                }
                else
                {
                    request.Method = "GET";
                }
                request.Timeout = 5000;
                return (HttpWebResponse)request.GetResponse();
            }
        }
    }

  • 相关阅读:
    [2020.11.15]CCPC Final 2019
    [2020.11.13]UOJ#424. 【集训队作业2018】count
    [2020.11.13]AtCoder Japan Alumni Group Summer Camp 2018 Day 2 K
    [2020.11.13]CF704C Black Widow
    [2020.11.13]CF765F Souvenirs
    [2020.11.13]AGC035D
    [2020.11.10]CSPS2020 翻车记
    拉格朗日反演(暂时鸽)与CF1349F2(xtq F2)
    [2020.6.20]ZJOI2020 Day1游记
    [2020.5.22]UOJ523 【美团杯2020】半前缀计数
  • 原文地址:https://www.cnblogs.com/xkzy/p/3944985.html
Copyright © 2011-2022 走看看