现在的位置: 首页 > 综合 > 正文

用C#实现Web代理服务器3

2012年01月20日 ⁄ 综合 ⁄ 共 2765字 ⁄ 字号 评论关闭
  9.创建Proxy类中的Run方法。Run方法是Proxy类中唯一的方法。其功能是从客户端接收HTTP请求,并传送到Web服务器,然后从Web服务器接收反馈来的数据,并传送到客户端。为了实现这二个不同方面的数据传送,Run方法中是通过两个Socket实例来实现的。在编写Run方法的时候,要注意下面两点:

  (1)由于HTTP建立于TCP协议之上,所以创建的Socket实例应该使用TCP协议。下面代码是创建可以传送HTTP请求命令到Web服务器和接收来自Web服务器反馈来信息的Socket实例:

  Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  (2)另外一个Socket是在代理服务程序侦听端口号,接收连接请求时候得到的,所以应该以此Socket为参数,利用Proxy类中的构造函数来创建一个Proxy实例。此Socket实现从客户端接收HTTP请求信息,并传送数据到客户端。

  Socket创建和使用是实现Web代理软件的关键。在构造函数代码后面,输入下列代码:

  public void Run()

  {

  string clientmessage = " " ;

  //存放来自客户端的HTTP请求字符串

  string URL = " " ;

  //存放解析出地址请求信息

  int bytes = ReadMessage(read, ref clientSocket, ref clientmessage);

  if (bytes == 0)

  {

  return ;

  }

  int index1 = clientmessage.IndexOf(' ');

  int index2 = clientmessage.IndexOf(' ', index1 + 1);

  if ((index1 == -1) || (index2 == -1))

  {

  throw new IOException();

  }

  string part1 = clientmessage.Substring(index1 + 1, index2 - index1);

  int index3 = part1.IndexOf('/', index1 + 8);

  int index4 = part1.IndexOf(' ', index1 + 8);

  int index5 = index4 - index3;

  URL = part1.Substring(index1 + 4, (part1.Length - index5) - 8);

  try

  {

  IPHostEntry IPHost = Dns.Resolve(URL);

  Console.WriteLine("远程主机名: " + IPHost.HostName);

  string [] aliases = IPHost.Aliases;

  IPAddress[] address = IPHost.AddressList;

  Console.WriteLine("Web服务器IP地址:" + address[0]);

  //解析出要访问的服务器地址

  IPEndPoint ipEndpoint = new IPEndPoint(address[0], 80);

  Socket IPsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

  //创建连接Web服务器端的Socket对象

  IPsocket.Connect(ipEndpoint);

  //Socket连Web接服务器

  if (IPsocket.Connected)

  Console.WriteLine("Socket 正确连接!");

  string GET = clientmessage;

  Byte[] ByteGet = ASCII.GetBytes(GET);

  IPsocket.Send(ByteGet, ByteGet.Length, 0);

  //代理访问软件对服务器端传送HTTP请求命令

  Int32 rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);

  //代理访问软件接收来自Web服务器端的反馈信息

  Console.WriteLine("接收字节数:" + rBytes.ToString());

  String strRetPage = null;

  strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);

  while (rBytes > 0)

  {

  rBytes = IPsocket.Receive(RecvBytes, RecvBytes.Length, 0);

  strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, rBytes);

  }

  IPsocket.Shutdown(SocketShutdown.Both);

  IPsocket.Close();

  SendMessage(clientSocket, strRetPage);

  //代理服务软件往客户端传送接收到的信息

  }

  catch (Exception exc2)

  {

  Console.WriteLine(exc2.ToString());

  }

  }

  

  //接收客户端的HTTP请求数据

  private int ReadMessage(byte [] ByteArray, ref Socket s, ref String clientmessage)

  {

  int bytes = s.Receive(ByteArray, 1024, 0);

  string messagefromclient = Encoding.ASCII.GetString(ByteArray);

  clientmessage = (String)messagefromclient;

  return bytes;

  }

  

  //传送从Web服务器反馈的数据到客户端

  private void SendMessage(Socket s, string message)

  {

  Buffer = new Byte[message.Length + 1];

  int length = ASCII.GetBytes(message, 0, message.Length, Buffer, 0);

  Console.WriteLine("传送字节数:" + length.ToString());

  s.Send(Buffer, length, 0);

  }

  至此,Proxy类的定义过程就完成了。

抱歉!评论已关闭.