跳到主要内容
版本:1.3.9

Tcp端口转发

一、说明

NATService是具有转发功能的TCP服务器。他的职能是将收到的TCP数据转发到多个目标服务器。也能将多个目标服务器的数据转发到连接客户端。

二、常见使用场景

  • **调试场景:**在生产环境中,想要调试客户端,要么中断服务器,要么就将实际数据转发到NAT,然后在不影响实际场景的情况下进行调试。
  • **内网穿透场景:**一般tcp都会使用转发式的内网穿透。

三、创建NATService

static void Main(string[] args)
{
MyNATService service = new MyNATService();
var config = new TouchSocketConfig();
config.SetListenIPHosts(new IPHost[] { new IPHost(7788) });

service.Setup(config);
service.Start();

Console.WriteLine("转发服务器已启动。已将7788端口转发到127.0.0.1:7789与127.0.0.1:7790地址");
}
提示

NATService支持客户端适配器和Ssl。也支持转发适配器和Ssl。

 class MyNATService : NATService
{
protected override void OnConnected(NATSocketClient socketClient, RRQMEventArgs e)
{
base.OnConnected(socketClient, e);

try
{
//此处模拟的是只要连接到NAT服务器,就转发。
//实际上,这个方法可以随时调用。
socketClient.AddTargetClient(new TouchSocketConfig().SetRemoteIPHost("127.0.0.1:7789"));
socketClient.AddTargetClient(new TouchSocketConfig().SetRemoteIPHost("127.0.0.1:7790"));
}
catch (Exception ex)
{
socketClient.Logger.Exception(ex);
}
}

protected override void OnTargetClientDisconnected(NATSocketClient socketClient, ITcpClient tcpClient, ClientDisconnectedEventArgs e)
{
socketClient.Logger.Message($"{socketClient.IP}:{socketClient.Port}的转发客户端{tcpClient.IP}:{tcpClient.Port}已经断开连接。");
base.OnTargetClientDisconnected(socketClient, tcpClient, e);
}

protected override byte[] OnNATReceived(NATSocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo)
{
//服务器收到的数据
return base.OnNATReceived(socketClient, byteBlock, requestInfo);
}

protected override byte[] OnTargetClientReceived(NATSocketClient socketClient, ITcpClient tcpClient, ByteBlock byteBlock, IRequestInfo requestInfo)
{
//连接的客户端收到的数据
return base.OnTargetClientReceived(socketClient, tcpClient, byteBlock, requestInfo);
}
}


四、转发断线重连

try
{
//此处模拟的是只要连接到NAT服务器,就转发。
//实际上,这个方法可以随时调用。
socketClient.AddTargetClient(new TouchSocketConfig()
.SetRemoteIPHost("127.0.0.1:7789")
.ConfigurePlugins(a=>
{
//在Pro中,使用以下任意方式,可实现转发客户端的断线重连。
a.Add<PollingKeepAlivePlugin<TcpClient>>()
.SetTick(1000);//每秒检查
//a.UseReconnection();
}));
}
catch (Exception ex)
{
socketClient.Logger.Exception(ex);
}