測試兩種方法獲取狀態碼
第一種 HttpWebRequest
public void GetHead(string url)
{
WebRequest Http = WebRequest.Create(url);
Http.Method="HEAD"//設置Method為HEAD
try{
HttpWebResponse response = (HttpWebResponse)http.GetResponse();
Console.Write(Convert.ToInt32(response.StatusCode) + " " + response.StatusCode.ToString());//Statuscode 為枚舉類型,200為正常,其他輸出異常,需要轉為int型才會輸出狀態碼
response.Close();
}
catch (WebException ex)
{
Console.WriteLine(Convert.ToInt32(((HttpWebResponse)ex.Response).StatusCode)+" "+((HttpWebResponse)ex.Response).StatusCode.ToString());
}
}
第二種 socket
public class SocketGetHead
public string GetHtml(string strUrl)
{
string strHost = GetHost(strUrl);
int port = 80;
if (strHost.IndexOf(":") != -1)
{
port = int.Parse(strHost.Substring(strHost.IndexOf(":") + 1));
strHost = strHost.Substring(0, strHost.IndexOf(":"));
}
string strGetHeader = "";
strGetHeader += "HEAD / HTTP/1.0\n";
strGetHeader += "Host: " + strHost + "\n";
strGetHeader += "\n";
byte[] getBytes = Encoding.ASCII.GetBytes(strGetHeader);
try
{
int iTotalCount;
byte[] responseBytes = GetHtmlOriginByte(strHost, port, getBytes, out iTotalCount); //得到網頁
string strResponse = Encoding.UTF8.GetString(responseBytes, 0, iTotalCount);
StringReader str = new StringReader(strResponse);
string line = str.ReadLine();
//分析此行字符串,獲取服務器響應狀態碼
Match M = RE.Match(line, @"\d\d\d");
return M.Value;
}
catch (System.Exception ex)
{
return "error";
}
}
private byte[] GetHtmlOriginByte(string strHost, int port, byte[] getBytes, out int iTotalCount)
{
int iReponseByteSize = 400 * 1024;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(strHost, port);
socket.Send(getBytes);
byte[] buffer = new byte[256];
byte[] responseBytes = new byte[iReponseByteSize];
int iNumber = socket.Receive(buffer, buffer.Length, SocketFlags.None);
iTotalCount = iNumber;
buffer.CopyTo(responseBytes, 0);
while (iNumber > 0)
{
iNumber = socket.Receive(buffer, buffer.Length, SocketFlags.None);
if (iTotalCount + iNumber >= responseBytes.Length)
{
//重新生成個更大的數組
byte[] temp = new byte[responseBytes.Length * 2];
//原數據copy到新數組中
responseBytes.CopyTo(temp, 0);
buffer.CopyTo(temp, iTotalCount - 1);
responseBytes = temp; //引用變更
}
else
{
buffer.CopyTo(responseBytes, iTotalCount - 1);
}
iTotalCount += iNumber; //索引位置增加
}
return responseBytes;
}
}
時間耗時代碼
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//代碼。。。
stopwatch.Stop();
long time = stopwatch.ElapsedMilliseconds;
Console.WriteLine("代碼執行時間為:" + time.ToString()+"ms");
對比發現HttpWebRequest 耗時2330ms,socket耗時608ms,相差差不多4倍.over