说明

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

常见使用场景

调试场景:在生产环境中,想要调试客户端,要么中断服务器,要么就将实际数据转发到NAT,然后在不影响实际场景的情况下进行调试。

可配置项

继承TcpService。

创建NATService

  1. static void Main(string[] args)
  2. {
  3. MyNATService service = new MyNATService();
  4. var config = new TouchSocketConfig();
  5. config.SetListenIPHosts(new IPHost[] { new IPHost(7788) });
  6. service.Setup(config);
  7. service.Start();
  8. Console.WriteLine("转发服务器已启动。已将7788端口转发到127.0.0.1:7789与127.0.0.1:7790地址");
  9. }

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

  1. class MyNATService : NATService
  2. {
  3. protected override void OnConnected(NATSocketClient socketClient, RRQMEventArgs e)
  4. {
  5. base.OnConnected(socketClient, e);
  6. try
  7. {
  8. //此处模拟的是只要连接到NAT服务器,就转发。
  9. //实际上,这个方法可以随时调用。
  10. socketClient.AddTargetClient(new RRQMConfig().SetRemoteIPHost("127.0.0.1:7789"));
  11. socketClient.AddTargetClient(new RRQMConfig().SetRemoteIPHost("127.0.0.1:7790"));
  12. }
  13. catch (Exception ex)
  14. {
  15. socketClient.Logger.Exception(ex);
  16. }
  17. }
  18. protected override void OnTargetClientDisconnected(NATSocketClient socketClient, ITcpClient tcpClient, ClientDisconnectedEventArgs e)
  19. {
  20. socketClient.Logger.Message($"{socketClient.IP}:{socketClient.Port}的转发客户端{tcpClient.IP}:{tcpClient.Port}已经断开连接。");
  21. base.OnTargetClientDisconnected(socketClient, tcpClient, e);
  22. }
  23. protected override byte[] OnNATReceived(NATSocketClient socketClient, ByteBlock byteBlock, IRequestInfo requestInfo)
  24. {
  25. //服务器收到的数据
  26. return base.OnNATReceived(socketClient, byteBlock, requestInfo);
  27. }
  28. protected override byte[] OnTargetClientReceived(NATSocketClient socketClient, ITcpClient tcpClient, ByteBlock byteBlock, IRequestInfo requestInfo)
  29. {
  30. //连接的客户端收到的数据
  31. return base.OnTargetClientReceived(socketClient, tcpClient, byteBlock, requestInfo);
  32. }
  33. }