C#通过Socket进行HttP/HTTPS操作网页的速度问题

    毫无疑问由于HTTP协议是基于TCP/IP的,而HttpWebRequest在封装过程中的一些处理或多或少的会影响到访问速度;至于影响多少,我在前段时间做一个国外网站操作的时候简单对比了下,HttpWebRequest和Socket原生操作的速度相差大概在5倍以上;

   很多时候其实我们并不是很关注速度影响,但是实际应用过程中就会遇到有客户要求的飞速(当然不排除一些客户认为线程越多速度越快)。

简单谈了下以上4个问题,其实还很是很片面,鉴于个人表达能力有限,有些东西还需要大家在实践中去认识了解;下面就来着重看下通过Socket操作HTTP/HTTPS;


前面我们已经知道了简单的HTTP协议,也知道HTTP是基于TCP/IP协议的,对于有网络经验的同学,我们就可以直接写Socket提交HTTP协议,这一步相对比较简单,我们直接看一下代码就OK了:

static byte[] InternalSocketHttp(IPEndPoint endpoint,

           HttpArgs args,
其实从事咖啡厅服务并不丢人
           HttpMethod method)

        {

            using (Socket sK = new Socket(AddressFamily.InterNetwork,

                        SocketType.Stream,

                        ProtocolType.Tcp))

            {

                try

                {

                    sK.Connect(endpoint);

                    if (sK.Connected)

                    {

                        byte[] buff = ParseHttpArgs(method, args);

                        if (sK.Send(buff) > 0)

                        {

                            return ParseResponse(endpoint,sK,args);

                        }

                    }

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex.Message);

                }

            }

            return null;

        }

其中有2个比较重要的函数一个是ParseHttpArgs(),另外一个是ParseResponse();

先看第一个函数:

static byte[] ParseHttpArgs(HttpMethod method, HttpArgs args)

        {

            StringBuilder bulider = new StringBuilder();

            if (method.Equals(HttpMethod.POST))

            {

                bulider.AppendLine(string.Format("POST {0} HTTP/1.1",

                    args.Url));

                bulider.AppendLine("Content-Type: application/x-www-form-urlencoded");

            }

            else

            {

                bulider.AppendLine(string.Format("GET {0} HTTP/1.1",

                args.Url));

            }

            bulider.AppendLine(string.Format("Host: {0}",

                args.Host));

            bulider.AppendLine("User-Agent: Mozilla/5.0 (Windows NT 6.1; IE 9.0)");

            if (!string.IsNullOrEmpty(args.Referer))

                bulider.AppendLine(string.Format("Referer: {0}",

                    args.Referer));

            bulider.AppendLine("Connection: keep-alive");

            bulider.AppendLine(string.Format("Accept: {0}",

                args.Accept));

            bulider.AppendLine(string.Format("Cookie: {0}",

                args.Cookie));

            if (method.Equals(HttpMethod.POST))

            {

                bulider.AppendLine(string.Format("Content-Length: {0}\r\n",

                   Encoding.Default.GetBytes(args.Body).Length));

                bulider.Append(args.Body);

            }

            else

            {

                bulider.Append("\r\n");

            }

            string header = bulider.ToString();

            return Encoding.Default.GetBytes(header);

        }

通过上面的代码,很清晰的我们就能看到ParseHttpArgs其实就是将HttpArgs的一些属性填充为HTTP协议,并返回其二进制内容用于Socket提交,其中值得注意的一点就是在HTTP协议头完毕后实际上需要一个空行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值