日期:2014-05-17  浏览次数:21001 次

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协议头完毕后实际上需要一个空行