# SimpleHttpProxyConsole 簡易端口轉發 C# (.net framework 4.5) ```csharp= using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; class Program { private const string SERVER_IP = "***.***.***.***"; // 目標伺服器的 IP private const string CHL_IP = "***.***.***.***"; // 本地 (也就是跳板) 的 IP private const int SERVER_A_PORT = 62000; // 目標伺服器的 Port private const int LOCAL_PORT = 62000; // 本地代理伺服器的 Port static async Task Main(string[] args) { TcpListener listener = new TcpListener(IPAddress.Any, LOCAL_PORT); listener.Start(); Console.WriteLine($"Proxy server is running on port {LOCAL_PORT}..."); while (true) { TcpClient client = await listener.AcceptTcpClientAsync(); _ = Task.Run(() => HandleClientAsync(client)); // 每個連線分別處理 } } private static async Task HandleClientAsync(TcpClient client) { using (client) { byte[] buffer = new byte[8192]; // 合理的緩衝區大小 NetworkStream clientStream = client.GetStream(); try { // 讀取用戶端的 HTTP 請求 int bytesRead = await clientStream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead <= 0) { return; // 用戶端關閉連線 } string clientRequest = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("Client Request Received:"); Console.WriteLine(clientRequest); // 創建與目標伺服器的連線 using (TcpClient server = new TcpClient(SERVER_IP, SERVER_A_PORT)) using (NetworkStream serverStream = server.GetStream()) { // 轉發用戶端請求到目標伺服器 await serverStream.WriteAsync(buffer, 0, bytesRead); // 接收目標伺服器的回應 using (MemoryStream responseStream = new MemoryStream()) { int bytesFromServer; while ((bytesFromServer = await serverStream.ReadAsync(buffer, 0, buffer.Length)) > 0) { responseStream.Write(buffer, 0, bytesFromServer); } // 處理目標伺服器的回應 byte[] serverResponseBytes = responseStream.ToArray(); string serverResponse = Encoding.UTF8.GetString(serverResponseBytes); Console.WriteLine("Server Response Received:"); Console.WriteLine(serverResponse); // 替換 IP 地址 if (serverResponse.Contains(SERVER_IP)) { serverResponse = serverResponse.Replace(SERVER_IP, CHL_IP); serverResponseBytes = Encoding.UTF8.GetBytes(serverResponse); } // 回傳處理後的回應給用戶端 await clientStream.WriteAsync(serverResponseBytes, 0, serverResponseBytes.Length); } } } catch (Exception ex) { Console.WriteLine($"Error: {ex.Message}"); } } } } ```