日期:2014-05-17 浏览次数:21001 次
??? 毫无疑问由于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协议头完毕后实际上需要一个空行