C#实现Web代理服务器

来源:互联网 发布:淘宝卖家中心订单提醒 编辑:程序博客网 时间:2024/05/17 23:47

代理服务程序是一种广泛使用的网络应用程序。代理程序的种类非常多,根据协议不同可以分成HTTP代理服务程序、FTP代理服务程序等,而运行代理服务程序的服务器也就相应称为HTTP代理服务器和FTP代理服务器。本文将介绍的Web代理服务程序代理的是HTTP协议。
  一、网络代理程序的优点
  代理服务所起的是一个桥的作用,它是网络信息的中转站。在网络中应用代理服务一般是基于以下几个原因:
  (1)充分利用IP地址资源。在局域网中,一般对外的IP地址都是非常有限的,为了保证局域网内部的主机都能够访问互联网资源,通过网络代理就可以实现。
  (2)能够保证网络安全。网络代理可以充当内部网和互联网之间的防火墙,通过过滤IP地址,限定某些IP地址对外部资源的访问。
  (3)能够有效地隐藏自己的IP地址和主机名。由于所有对外网的请求都是通过代理服务器实现的,所以目的主机只能知道代理服务器的IP地址。
  (4)提高网络速度。通常代理服务器都设有一个较大的硬盘缓冲区,它存储界数据,当你再访问相同的数据时,则可以直接从缓冲区中取出信息,从而提高访问速度。
  二、网络代理的类型及实现原理
  网络代理服务根据工作层次,一般可分为应用层代理、传输层代理和SOCKS代理。应用层代理是工作在TCP/IP参考模型的应用层之上,它支持对应用层协议(如HTTP、FTP)的代理。它提供的控制最多,但是不灵活,必须要有相应的协议支持。如果协议不支持代理(如SMTP和POP),那就只能在应用层以下代理,也即传输层代理。传输层代理直接与TCP层交互,更加灵活。要求代理服务器具有部分真正服务器的功能:监听特定TCP或UDP端口,接收客户端的请求同时向客户端发出相应的响应。另一种代理需要改变客户端的IP栈,即SOCKS代理。它是可用的最强大、最灵活的代理标准协议。SOCK V4允许代理服务器内部的客户端完全地连接到外部的服务器,SOCK V5增加了对客户端的授权和认证,因此它是一种安全性较高的代理。本节后面介绍的代理是一种应用层上面的代理,所代理的协议是HTTP,也就是经常见到的Web代理。
  正如上面所说,网络代理就是一个连接客户端(需要代理的计算机)和服务器端(提供访问资源的服务器)的桥。要实现这种桥的功能,网络代理就必须满足下列条件,其实也是代理服务的运行的流程:
  (1)接收并解析客户端的请求。
  (2)创建到服务器的新连接,并转发客户端的请求信息。
  (3)接收服务器反馈的信息。
  (4)解释服务器的响应并将该响应传回给客户端。
  网络代理虽然有很多优点,但由于使用代理后,自己对网络的所有请求都是通过代理服务器这个中间人来实现的,所以有可能碰上存有恶意的人监听你的输入的内容。同样,如果选择的代理服务器的带宽比较小,使用代理还会降低网速。
  总而言之,使用代理有利有弊,使用者要根据自身的情况来决定。但无论如何,选择一个好的代理服务器是非常重要的。
  三、C#实现Web代理服务程序
  经过了上面的介绍,我想大家对代理服务应该有了一个基本的认识,下面就让我们通过一个实例来深入体会一下如何用C#实现Web代理服务。Web代理服务的功能顺序是这样的:
  (1)侦听端口,等待客户端浏览器发送来的Web请求信息。
  (2)接收到客户端Web请求信息后,解析出目标Web服务器的地址,并创建一个Socket实例,并以此实例连接Web服务器上。
  (3)通过创建的Socket传送客户端的Web请求数据包到Web服务器的80端口。
  (4)接收Web服务器返回的页面数据。
  (5)把接收来的数据传送到客户端,从而实现Web代理。
  客户端对某个Web地址的浏览,可能要传送很多的Web请求信息(比如网页中的图像、Flash等),为了更快更准确地处理这些信息,Web代理服务程序通常采用多线程来处理每一个Web请求。细心的读者可能会发现,处理每一个客户端的Web请求信息,代理服务器软件都要使用二个Socket,一个是用来接收/传送客户机的信息,一个是和Web服务器进行交流。为了区分这二个Socket,我们把和服务器对话的称为“服务Socket”,和客户端机器对话的称为“客户Socket”。
  下面就开始Web代理服务程序的编写工作。这个实例包含三个部分内容:
  1.创建一个Web代理类。
  2.Web代理服务的类的实例化。
  3.如何通过这个Web代理类的实例实现Web代理服务。
  (一)创建一个Web代理类
  具体操作步骤如下:
  1.启动Visual Studio.Net,依次选择“文件”、“新建”、“项目”菜单后,在弹出“新建项目”对话框中将“项目类型”设置为“Visual C#项目”,将“模板”设置为“Windows应用程序”,在“名称”文本框中输入“WebProxy”,在“位置”文本框中输入“E:VS.NET项目”,然后单击“确定”按钮,这样项目便建立好了。
  2.依次选择菜单“项目”、“添加类”,将弹出“添加新项”对话框。
  3.将“模板”设置为“类”。
  4.在“名称”文本框中输入“Proxy”,单击“打开”按钮
  5.在“解决方案资源管理器”窗口中,双击Proxy.cs文件,进入Proxy.cs文件的编辑界
  6.在Proxy.cs源文件的开头,添加下列代码,下列代码是导入Proxy.cs中要使用到的命名空间:
  using System;
  using System.Net;
  using System.Net.Sockets;
  using System.Text;
  using System.IO;
  7.用下列构造函数替代默认的构造函数。下面的代码是在Proxy类中创建一个构造函数。Proxy类只有一个构造函数,并且这个构造函数只有一个参数,这个参数是Socket对象,它主要用来和客户端进行数据交换,是一个“客户Socket”:
  public Proxy(Socket socket)
  {
  //
  // TODO: 在此处添加构造函数逻辑
  //
  this.clientSocket = socket ;
  }
  8.在定义Proxy类代码区中加入下列代码,下列代码是定义Proxy类中的使用的一些变量,这些变量主要是在后面的定义Run方法中使用。
  Socket clientSocket;
  Byte[] read = new byte[1024];
  //定义一个空间,存储来自客户端请求数据包
  Byte [] Buffer = null;
  Encoding ASCII = Encoding.ASCII;
  //设定编码
  Byte[] RecvBytes = new Byte[4096];
  //定义一个空间,存储Web服务器返回的数据
  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)
  }
  //接收客户端的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类的定义过程就完成了。
  (二)利用Proxy类,实现Web代理
  下面是利用Proxy类实现Web代理程序的具体实现步骤,Proxy类被定义在命名空间WebProxy中:
  1.在Visual Studio .Net的代码编辑器中打开Class1.cs文件,进入Class1.cs的代码编辑界面。
  2.在Class1.cs源文件的开头导入下列命名空间:
  using System;
  using System.Net;
  using System.Net.Sockets;
  using System.Text;
  using System.IO;
  using System.Threading;
  using WebProxy;
  3.在Main函数中添加下列代码,下列代码是利用Proxy类,来实现Web代理程序:
  const int port = 8000 ;
  //定义端口号
  TcpListener tcplistener = new TcpListener(port);
  Console.WriteLine("侦听端口号: " + port.ToString());
  tcplistener.Start();
  //侦听端口号
  while (true)
  {
  Socket socket = tcplistener.AcceptSocket();
  //并获取传送和接收数据的Scoket实例
  Proxy proxy = new Proxy(socket);
  //Proxy类实例化
  Thread thread = new Thread(new ThreadStart(proxy.Run));
  //创建线程
  thread.Start();
  //启动线程
  }
  保存上面的所有步骤,这样一个简单Web代理程序就算是完成了。此Web代理程序侦听的是8000端口号。
  (三)测试Web代码程序
  Web代理程序要通过二台计算机才能够实现,其中的一台计算机运行Web代理程序充当Web代理服务器,另外一台计算机充当客户机,通过Web代理服务器来浏览网页。在确定Web代理软件运行后,需要对客户机进行进行必要的设置:
  1.打开IE浏览器。
  2.依次选择“工具”、“Internet选项”,在弹出的“Internet选项”对话框中选择“连接”页面,单击其中的“局域网设置”按钮,在弹出的“局域网(LAN)设置”对话框,选择“为LAN使用代理服务器(X),(这些设置不会应用于拨号和VPN连接)”多选框,并在其中的“地址”文本框中输入代理服务器的IP地址,比如“10.138.198.213”,在“端口”文本框中输入“8000”。


  此时客户端的设置就完
在确定IP地址为“10.138.198.213”的这台计算机已经运行上面介绍的Web代理程序后,打开客户端的IE浏览器,并输入要浏览的网址,就可以通过Web代理服务器来浏览网页了。图4是Web代理服务程序在服务器端运行时的界面:

  四、总结

  至此一个简单的Web代理服务软件就算基本完成了。虽然代理服务的实现原理相对简单,但具体实现还是很繁琐的。网络代理是一个内容丰富,实现复杂的论题,本节介绍的代理服务软件,无论在实现的协议种类,还是实现的功能,都只能算很小的一部分。希望各位能够通过本文的介绍,结合其他相关的知识,创造出功能更强大、安全性更高,使用更稳定的网络代理服务程序来。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机进水后无服务怎么办 苹果6进水无服务怎么办 华为手机突然无服务怎么办 sim卡显示无服务怎么办 华为麦芒进水无限开关机怎么办 华为麦芒5进水黑屏怎么办 华为麦芒6进水了怎么办 4g手机开不开机怎么办 全屏钢化膜总是翘边怎么办 华为麦芒屏幕触屏失灵怎么办 华为麦芒5运行慢怎么办 手机屏保密码忘记了怎么办 麦芒5密码锁忘了怎么办 超薄手机壳松了怎么办 华为麦芒5声音小怎么办 笔记本外壳a面裂了怎么办 苹果手机外壳摔坏了怎么办 挂衣服肩膀出包怎么办 摩拜单车手机号注销了怎么办 摩拜单车手机号码换了怎么办 摩拜单车换手机号码打不开怎么办 摩拜单车丢了怎么办 摩拜单车忘锁了怎么办 透明手机壳粘指纹怎么办 tpu手机壳变黄了怎么办 0pp0手机声音小怎么办 橡胶皮套晒坏了怎么办 宝宝晚上吹空调发烧怎么办 玩手机手指尖疼怎么办 手机型号不支持微信运动怎么办 手腕向下压会疼怎么办 手腕韧带拉伤怎么办恢复快 华为手机用车载充电慢怎么办 华为麦芒6充电慢怎么办 oppo手机压弯了怎么办 麦芒5电池不耐用怎么办 华为7x照相模糊怎么办 华为麦芒6照相虚怎么办 荣耀8gps信号弱怎么办 华为麦芒4手机卡顿怎么办 华为麦芒4玩游戏卡怎么办