zoukankan      html  css  js  c++  java
  • C#网络连接 socket支持post,get之类http协议(chunked,gzip),同时支持webservice协议。

    熟练掌握之后web qq的协议就很简单了,本人已经做了一个完整的webqq协议。如果以下有问题的话,请发我qq邮箱:511522329@qq.com微笑

    class Program
        {
            static void Main(string[] args)
            {
                //httpNetHelper net = new httpNetHelper();
                //Console.WriteLine(net.CreatePostString("http://127.0.0.1:8080/smshttp",
                //    "act=getbalance&unitid=826&username=DGHK&passwd=123456"));
                Console.WriteLine("********WebService Testing!*******");
                HttpHelper http = new HttpHelper();
                Dictionary<string, string> dics = new Dictionary<string, string>();
                dics.Add("byProvinceName", "江苏");
                http.NameSpace = "http://WebXml.com.cn/";
                http.WEncoding = Encoding.UTF8;
                Console.WriteLine(http.GetWebServiceStr("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx",
                  "getSupportCity", dics));
                Console.WriteLine("*********Get Testing!***********");
                http.WEncoding = Encoding.UTF8;
                http.IniStalling();
                Console.WriteLine(http.MethodGetHttpStr("http://127.*.*.*:8080/smshttp?act=getbalance&unitid=826&username=DGHK&passwd=123456"));
                Console.WriteLine("*********Post Testing!**********");
                http.WEncoding = Encoding.UTF8;
                http.IniStalling();
                Console.WriteLine(http.MethodPostHttpStr("http://127.*.*.*:8080/smshttp?act=getbalance&unitid=826&username=DGHK&passwd=123456",""));
                Console.ReadLine();
            }
        }
    

      


    第一种写法:

     internal class httpNetHelper
        {
    
            public string CreateGetString(string geturl)
            {
                return GetHtml(geturl, null);
            }
            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();
            }


     

    第二种写法并调用:

        /// <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>
            /// 请求或者返回的头文件(www.studytree.cn  学习树,家教,大学生)
            /// </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; }
    
            public string GetWebServiceStr(string url, string MethodName, Dictionary<string, string> MethodParms)
            {
    
                if (string.IsNullOrEmpty(NameSpace))
                    throw new MissingFieldException("请输入NameSpace");
                AddHttpHeader("SOAPAction", "\"" + NameSpace.TrimEnd('/') + "/" + MethodName + "\"");
                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 + "\">"));
                foreach (KeyValuePair<string, string> keyValuePair in MethodParms)
                {
                    sb.AppendLine(string.Format(" <{0}>{1}</{0}>", keyValuePair.Key, keyValuePair.Value));
                }
                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\r\n");
                AddHttpHeader("Host", host);
                if (!string.IsNullOrEmpty(cookies))
                    AddHttpHeader("Cookie", cookies);
                foreach (var item in HttpHeaders)
                {
                    httpHeader.Append(string.Format("{0}: {1}\r\n", item.Key, item.Value));
                }
                string httpData = string.Format("{0}\r\n{1}", httpHeader, data);
                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)
            {
                List<string> heads = new List<string>();
                foreach (HttpHeaderModel item in responseHttpHeaders)
                {
                    if (item.Key == key)
                        heads.Add(item.Value);
                }
                return heads;
            }
            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());
            }
        }
  • 相关阅读:
    slf4j中的MDC
    redis incr incrby decr decrby命令
    Java接口响应超时监控
    JDK1.7.0_45源码阅读<java.lang.Boolean>
    Debug JDK变量显形
    Java全角、半角字符的关系以及转换
    模型选择
    经验风险最小化
    支持向量机(下)
    支持向量机(上)
  • 原文地址:https://www.cnblogs.com/xiaose1205/p/2760073.html
Copyright © 2011-2022 走看看