加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#实现多线程的Web代理服务器实例

发布时间:2020-12-15 05:55:19 所属栏目:百科 来源:网络整理
导读:本篇章节讲解C#实现多线程的Web代理服务器。供大家参考研究。具体如下: /**Proxy.cs:C# Programming Tips gt;csc Proxy.csusing System;using System.Net;using System.Net.Sockets;using System.Text;using System.IO;using System.Threading;nam

本篇章节讲解C#实现多线程的Web代理服务器。分享给大家供大家参考。具体如下:

/**
Proxy.cs:
C# Programming Tips & Techniques
by Charles Wright,Kris Jamsa
Publisher: Osborne/McGraw-Hill (December 28,2001)
ISBN: 0072193794
*/
// Proxy.cs -- Implements a multi-threaded Web proxy server
//
//    Compile this program with the following command line:
//     C:>csc Proxy.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading;
namespace nsProxyServer
{
 public class ProxyServer
 {
  static public void Main (string [] args)
  {
   int Port = 3125;
   if (args.Length > 0)
   {
    try
    {
     Port = Convert.ToInt32 (args[0]);
    }
    catch
    {
     Console.WriteLine ("Please enter a port number.");
     return;
    }
   }
   try
   {
    // Create a listener for the proxy port
    TcpListener sockServer = new TcpListener (Port);
    sockServer.Start ();
    while (true)
    {
     // Accept connections on the proxy port.
     Socket socket = sockServer.AcceptSocket ();
     // When AcceptSocket returns,it means there is a connection. Create
     // an instance of the proxy server class and start a thread running.
     clsProxyConnection proxy = new clsProxyConnection (socket);
     Thread thrd = new Thread (new ThreadStart (proxy.Run));
     thrd.Start ();
     // While the thread is running,the main program thread will loop around
     // and listen for the next connection request.
    }
   }
   catch (IOException e)
   {
    Console.WriteLine (e.Message);
   }
  }
 }
 class clsProxyConnection
 {
  public clsProxyConnection (Socket sockClient)
  {
   m_sockClient = sockClient;
  }
  Socket m_sockClient; //,m_sockServer;
  Byte [] readBuf = new Byte [1024];
  Byte [] buffer = null;
  Encoding ASCII = Encoding.ASCII;
  public void Run ()
  {
   string strFromClient = "";
   try
   {
    // Read the incoming text on the socket/
    int bytes = ReadMessage (m_sockClient,readBuf,ref strFromClient);
    // If it's empty,it's an error,so just return.
    // This will termiate the thread.
    if (bytes == 0)
     return;
    // Get the URL for the connection. The client browser sends a GET command
    // followed by a space,then the URL,then and identifer for the HTTP version.
    // Extract the URL as the string betweeen the spaces.
    int index1 = strFromClient.IndexOf (' ');
    int index2 = strFromClient.IndexOf (' ',index1 + 1);
    string strClientConnection =
      strFromClient.Substring (index1 + 1,index2 - index1);
    if ((index1 < 0) || (index2 < 0))
    {
     throw (new IOException ());
    }
    // Write a messsage that we are connecting.
    Console.WriteLine ("Connecting to Site " +
         strClientConnection);
    Console.WriteLine ("Connection from " +
         m_sockClient.RemoteEndPoint);
    // Create a WebRequest object.
    WebRequest req = (WebRequest) WebRequest.Create
              (strClientConnection);
    // Get the response from the Web site.
    WebResponse response = req.GetResponse ();
    int BytesRead = 0;
    Byte [] Buffer = new Byte[32];
    int BytesSent = 0;
    // Create a response stream object.
    Stream ResponseStream = response.GetResponseStream();
    // Read the response into a buffer.
    BytesRead = ResponseStream.Read(Buffer,32);
    StringBuilder strResponse = new StringBuilder("");
    while (BytesRead != 0)
    {
     // Pass the response back to the client
     strResponse.Append(Encoding.ASCII.GetString(Buffer,BytesRead));
     m_sockClient.Send(Buffer,BytesRead,0);
     BytesSent += BytesRead;
     // Read the next part of the response
     BytesRead = ResponseStream.Read(Buffer,32);
    }
   }
   catch (FileNotFoundException e)
   {
    SendErrorPage (404,"File Not Found",e.Message);
   }
   catch (IOException e)
   {
    SendErrorPage (503,"Service not available",e.Message);
   }
   catch (Exception e)
   {
     SendErrorPage (404,e.Message);
     Console.WriteLine (e.StackTrace);
     Console.WriteLine (e.Message);
   }
   finally
   {
    // Disconnect and close the socket.
    if (m_sockClient != null)
    {
     if (m_sockClient.Connected)
     {
      m_sockClient.Close ();
     }
    }
   }
   // Returning from this method will terminate the thread.
  }
  // Write an error response to the client.
  void SendErrorPage (int status,string strReason,string strText)
  {
   SendMessage (m_sockClient,"HTTP/1.0" + " " +
       status + " " + strReason + "rn");
   SendMessage (m_sockClient,"Content-Type: text/plain" + "rn");
   SendMessage (m_sockClient,"Proxy-Connection: close" + "rn");
   SendMessage (m_sockClient,"rn");
   SendMessage (m_sockClient,status + " " + strReason);
   SendMessage (m_sockClient,strText);
  }
  // Send a string to a socket.
  void SendMessage (Socket sock,string strMessage)
  {
   buffer = new Byte [strMessage.Length + 1];
   int len = ASCII.GetBytes (strMessage.ToCharArray(),strMessage.Length,buffer,0);
   sock.Send (buffer,len,0);
  }
  // Read a string from a socket.
  int ReadMessage (Socket sock,byte [] buf,ref string strMessage)
  {
   int iBytes = sock.Receive (buf,1024,0);
   strMessage = Encoding.ASCII.GetString (buf);
   return (iBytes);
  }
 }
}

希望本文所述对大家的C#程序设计有所帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读