zoukankan      html  css  js  c++  java
  • 用C#实现Web代理服务器3

      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类的定义过程就完成了。
  • 相关阅读:
    s3c2440裸机-内存控制器(三-3、norflash编程之uboot中操作norflash)
    s3c2440裸机-内存控制器(三-2、norflash编程之适配访问时序)
    s3c2440裸机-异常中断(五. irq之定时器中断)
    s3c2440裸机-异常中断(四. irq之外部中断)
    s3c2440裸机-异常中断(三. swi软中断)
    s3c2440裸机-异常中断(二. und未定义指令异常)
    s3c2440裸机-异常中断(一. 异常、中断的原理与流程)
    s3c2440裸机-代码重定位、清bss的优化和位置无关码
    buildroot教程
    软件项目的目录结构
  • 原文地址:https://www.cnblogs.com/leeairw/p/138985.html
Copyright © 2011-2022 走看看