www.pudn.com > Crawler_bemjh.rar > HTTP.cs
using System;
using System.Drawing;
using System.Xml;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Resources;
using System.Threading;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Net;
using System.Net.Sockets;
namespace CrawlerLib
{
///
/// 关于HTTP的类。
///
public class MyUri : System.Uri
{
public MyUri(string uriString):base(uriString)
{
}
public int Depth;
}
// 请求类
public class MyWebRequest
{
public MyWebRequest(Uri uri, bool bKeepAlive)
{
Headers = new WebHeaderCollection();
RequestUri = uri;
Headers["Host"] = uri.Host;
KeepAlive = bKeepAlive;
if(KeepAlive)
Headers["Connection"] = "Keep-Alive";
Method = "GET";
}
public static MyWebRequest Create(Uri uri, MyWebRequest AliveRequest, bool bKeepAlive)
{
if( bKeepAlive &&
AliveRequest != null &&
AliveRequest.response != null &&
AliveRequest.response.KeepAlive &&
AliveRequest.response.socket.Connected &&
AliveRequest.RequestUri.Host == uri.Host)
{
AliveRequest.RequestUri = uri;
return AliveRequest;
}
return new MyWebRequest(uri, bKeepAlive);
}
public MyWebResponse GetResponse()
{
if(response == null || response.socket == null || response.socket.Connected == false)
{
response = new MyWebResponse();
response.Connect(this);
response.SetTimeout(Timeout);
}
response.SendRequest(this);
response.ReceiveHeader();
return response;
}
public int Timeout;
public WebHeaderCollection Headers;
public string Header;
public Uri RequestUri;
public string Method;
public MyWebResponse response;
public bool KeepAlive;
}
// 响应类
public class MyWebResponse
{
public MyWebResponse()
{
}
public void Connect(MyWebRequest request)
{
ResponseUri = request.RequestUri;
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint remoteEP = new IPEndPoint(Dns.Resolve(ResponseUri.Host).AddressList[0], ResponseUri.Port);
socket.Connect(remoteEP);
}
public void SendRequest(MyWebRequest request)
{
ResponseUri = request.RequestUri;
request.Header = request.Method+" "+ResponseUri.PathAndQuery+" HTTP/1.0\r\n"+request.Headers;
socket.Send(Encoding.Default.GetBytes(request.Header));//-
}
public void SetTimeout(int Timeout)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, Timeout*1000);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, Timeout*1000);
}
public void ReceiveHeader()
{
Header = "";
Headers = new WebHeaderCollection();
byte[] bytes = new byte[10];
while(socket.Receive(bytes, 0, 1, SocketFlags.None) > 0)
{
Header += Encoding.Default.GetString(bytes, 0, 1);//-
if(bytes[0] == '\n' && Header.EndsWith("\r\n\r\n"))
break;
}
MatchCollection matches = new Regex("[^\r\n]+").Matches(Header.TrimEnd('\r', '\n'));
for(int n = 1; n < matches.Count; n++)
{
string[] strItem = matches[n].Value.Split(new char[] { ':' }, 2);
if(strItem.Length > 0)
Headers[strItem[0].Trim()] = strItem[1].Trim();
}
// check if the page should be transfered to another location
if( matches.Count > 0 && (
matches[0].Value.IndexOf(" 302 ") != -1 ||
matches[0].Value.IndexOf(" 301 ") != -1))
// check if the new location is sent in the "location" header
if(Headers["Location"] != null)
{
try { ResponseUri = new Uri(Headers["Location"]); }
catch { ResponseUri = new Uri(ResponseUri, Headers["Location"]); }
}
ContentType = Headers["Content-Type"];
if(Headers["Content-Length"] != null)
ContentLength = int.Parse(Headers["Content-Length"]);
KeepAlive = (Headers["Connection"] != null && Headers["Connection"].ToLower() == "keep-alive") ||
(Headers["Proxy-Connection"] != null && Headers["Proxy-Connection"].ToLower() == "keep-alive");
}
public void Close()
{
socket.Close();
}
public Uri ResponseUri;
public string ContentType;
public int ContentLength;
public WebHeaderCollection Headers;
public string Header;
public Socket socket;
public bool KeepAlive;
}
//
public class HTTP
{
public HTTP()
{
}
}
}