# 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}");
}
}
}
}
```