首页 > 编程 > C# > 正文

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

2019-10-29 21:40:54
字体:
来源:转载
供稿:网友

这篇文章主要介绍了C#实现多线程的Web代理服务器,涉及C#多线程代理服务器的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C#实现多线程的Web代理服务器。分享给大家供大家参考。具体如下:

 

 
  1. /** 
  2. Proxy.cs: 
  3. C# Programming Tips & Techniques 
  4. by Charles Wright, Kris Jamsa 
  5. Publisher: Osborne/McGraw-Hill (December 28, 2001) 
  6. ISBN: 0072193794 
  7. */ 
  8. // Proxy.cs -- Implements a multi-threaded Web proxy server 
  9. // 
  10. // Compile this program with the following command line: 
  11. // C:>csc Proxy.cs 
  12. using System; 
  13. using System.Net; 
  14. using System.Net.Sockets; 
  15. using System.Text; 
  16. using System.IO; 
  17. using System.Threading; 
  18. namespace nsProxyServer 
  19. public class ProxyServer 
  20. static public void Main (string [] args) 
  21. int Port = 3125; 
  22. if (args.Length > 0) 
  23. try 
  24. Port = Convert.ToInt32 (args[0]); 
  25. catch 
  26. Console.WriteLine ("Please enter a port number."); 
  27. return
  28. try 
  29. // Create a listener for the proxy port 
  30. TcpListener sockServer = new TcpListener (Port); 
  31. sockServer.Start (); 
  32. while (true
  33. // Accept connections on the proxy port. 
  34. Socket socket = sockServer.AcceptSocket (); 
  35. // When AcceptSocket returns, it means there is a connection. Create 
  36. // an instance of the proxy server class and start a thread running. 
  37. clsProxyConnection proxy = new clsProxyConnection (socket); 
  38. Thread thrd = new Thread (new ThreadStart (proxy.Run)); 
  39. thrd.Start (); 
  40. // While the thread is running, the main program thread will loop around 
  41. // and listen for the next connection request. 
  42. catch (IOException e) 
  43. Console.WriteLine (e.Message); 
  44. class clsProxyConnection 
  45. public clsProxyConnection (Socket sockClient) 
  46. m_sockClient = sockClient; 
  47. Socket m_sockClient; //, m_sockServer; 
  48. Byte [] readBuf = new Byte [1024]; 
  49. Byte [] buffer = null
  50. Encoding ASCII = Encoding.ASCII; 
  51. public void Run () 
  52. string strFromClient = ""
  53. try 
  54. // Read the incoming text on the socket/ 
  55. int bytes = ReadMessage (m_sockClient, 
  56. readBuf, ref strFromClient); 
  57. // If it's empty, it's an error, so just return. 
  58. // This will termiate the thread. 
  59. if (bytes == 0) 
  60. return
  61. // Get the URL for the connection. The client browser sends a GET command 
  62. // followed by a space, then the URL, then and identifer for the HTTP version. 
  63. // Extract the URL as the string betweeen the spaces. 
  64. int index1 = strFromClient.IndexOf (' '); 
  65. int index2 = strFromClient.IndexOf (' ', index1 + 1); 
  66. string strClientConnection = 
  67. strFromClient.Substring (index1 + 1, index2 - index1); 
  68. if ((index1 < 0) || (index2 < 0)) 
  69. throw (new IOException ()); 
  70. // Write a messsage that we are connecting. 
  71. Console.WriteLine ("Connecting to Site " + 
  72. strClientConnection); 
  73. Console.WriteLine ("Connection from " + 
  74. m_sockClient.RemoteEndPoint); 
  75. // Create a WebRequest object. 
  76. WebRequest req = (WebRequest) WebRequest.Create 
  77. (strClientConnection); 
  78. // Get the response from the Web site. 
  79. WebResponse response = req.GetResponse (); 
  80. int BytesRead = 0; 
  81. Byte [] Buffer = new Byte[32]; 
  82. int BytesSent = 0; 
  83. // Create a response stream object. 
  84. Stream ResponseStream = response.GetResponseStream(); 
  85. // Read the response into a buffer. 
  86. BytesRead = ResponseStream.Read(Buffer,0,32); 
  87. StringBuilder strResponse = new StringBuilder(""); 
  88. while (BytesRead != 0) 
  89. // Pass the response back to the client 
  90. strResponse.Append(Encoding.ASCII.GetString(Buffer, 
  91. 0, BytesRead)); 
  92. m_sockClient.Send(Buffer, BytesRead, 0); 
  93. BytesSent += BytesRead; 
  94. // Read the next part of the response 
  95. BytesRead = ResponseStream.Read(Buffer, 0, 32); 
  96. catch (FileNotFoundException e) 
  97. SendErrorPage (404, "File Not Found", e.Message); 
  98. catch (IOException e) 
  99. SendErrorPage (503, "Service not available", e.Message); 
  100. catch (Exception e) 
  101. SendErrorPage (404, "File Not Found", e.Message); 
  102. Console.WriteLine (e.StackTrace); 
  103. Console.WriteLine (e.Message); 
  104. finally 
  105. // Disconnect and close the socket. 
  106. if (m_sockClient != null
  107. if (m_sockClient.Connected) 
  108. m_sockClient.Close (); 
  109. // Returning from this method will terminate the thread. 
  110. // Write an error response to the client. 
  111. void SendErrorPage (int status, string strReason, string strText) 
  112. SendMessage (m_sockClient, "HTTP/1.0" + " " + 
  113. status + " " + strReason + "/r/n"); 
  114. SendMessage (m_sockClient, "Content-Type: text/plain" + "/r/n"); 
  115. SendMessage (m_sockClient, "Proxy-Connection: close" + "/r/n"); 
  116. SendMessage (m_sockClient, "/r/n"); 
  117. SendMessage (m_sockClient, status + " " + strReason); 
  118. SendMessage (m_sockClient, strText); 
  119. // Send a string to a socket. 
  120. void SendMessage (Socket sock, string strMessage) 
  121. buffer = new Byte [strMessage.Length + 1]; 
  122. int len = ASCII.GetBytes (strMessage.ToCharArray(), 
  123. 0, strMessage.Length, buffer, 0); 
  124. sock.Send (buffer, len, 0); 
  125. // Read a string from a socket. 
  126. int ReadMessage (Socket sock, byte [] buf, ref string strMessage) 
  127. int iBytes = sock.Receive (buf, 1024, 0); 
  128. strMessage = Encoding.ASCII.GetString (buf); 
  129. return (iBytes); 

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表