说明

TcpClient是TCP客户端的实现类。

可配置项

属性名 属性描述
SetBufferLength 缓存池容量,默认1024*10
SetMaxPackageSize 数据包最大值,默认1024102410。该值会在适当时间,直接作用DataHandlingAdapter.MaxPackageSize
SetRemoteIPHost 链接到的远程IPHost,支持域名。支持类型:
1. 使用IP&Port,传入形如:127.0.0.1:7789的字符串即可。
1. 使用域名,必须包含协议类型,形如:http://baidu.com或者https://baidu.com:80
UseSeparateThreadSend 在异步发送时,使用独立线程发送,设置为True时,发送流量大大提高,但是及时性会稍降。
SetReceiveType 接收类型。
- AUTO:自动接收模式。
- None:不投递IO接收申请,用户可通过GetStream,获取到流以后,自己处理接收。注意:连接端不会感知主动断开。
UsePlugin 是否启用插件。在启用时或许会带来一点点性能损耗,基本上不是千万数据交互根本不值一提。
SetClientSslOption Ssl配置,为Null时则不启用。
注意,当RemoteIPHost使用https、wss的域名时,该配置会使用系统默认配置生效。
SetKeepAliveValue 为Socket设置的属性。
注意:该配置仅在window平台生效。
SetBindIPHost 绑定端口。
- 在UdpSessionBase中表示本地监听地址
- 在TcpClient中表示固定客户端端口号。
SetMaxPackageSize 数据包最大值,默认1024102410。该值会在适当时间,直接作用于DataHandlingAdapter.MaxPackageSize属性。
UseNoDelay 设置Socket的NoDelay属性,默认false。
UseReuseAddress 启用端口复用。该配置可在服务器、或客户端在监听端口时,运行监听同一个端口。可以一定程度缓解端口来不及释放的问题

支持插件接口客户端、服务器均支持

声明自定义实例类,然后实现ITcpPlugin接口,即可实现下列事务的触发。
或者继承自TcpPluginBase类,重写相应方法即可。

|

ITcpPlugin

OnConnected 客户端连接成功后触发
OnConnecting 在即将完成连接时触发。
OnDisconnected 会话断开后触发
OnReceivedData 在收到数据时触发
OnSendingData 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。
OnIDChanged 当Client的ID被更改后触发

创建TcpClient

非泛型创建TcpService时,实际上是使用了默认的SocketClient,此时会将收到的数据从Received事件中直接抛出。创建过程如下:

  1. TcpClient tcpClient = new TcpClient();
  2. tcpClient.Connected += (client, e) => { };//成功连接到服务器
  3. tcpClient.Disconnected += (client, e) => { };//从服务器断开连接,当连接不成功时不会触发。
  4. tcpClient.Received += (client, byteBlock, requestInfo) =>
  5. {
  6. //从服务器收到信息
  7. string mes = Encoding.UTF8.GetString(byteBlock.Buffer, 0, byteBlock.Len);
  8. Console.WriteLine($"接收到信息:{mes}");
  9. };
  10. //声明配置
  11. TouchSocketConfig config = new TouchSocketConfig();
  12. config.SetRemoteIPHost(new IPHost("127.0.0.1:7789"))
  13. .UsePlugin()
  14. .SetBufferLength(1024 * 10);
  15. //载入配置
  16. tcpClient.Setup(config);
  17. tcpClient.Connect();
  18. tcpClient.Send("RRQM");

主要方法简介

方法名 功能简介
Connect 连接到服务器。
Send 发送数据,该数据会经适配器封装。
DefaultSend 发送数据,该数据会绕过适配器,直接发送。

同步发送(Send)

使用
TcpClient已经内置了三种同步发送方法,直接调用就可以发送,但需要注意的是,通过该方法发送的数据,会经过适配器,如果想要直接发送,请使用DefaultSend。如果发送失败,则会立即抛出异常。

  1. public virtual void Send(byte[] buffer);
  2. public virtual void Send(ByteBlock byteBlock);
  3. public virtual void Send(byte[] buffer, int offset, int length);

调用顺序

  1. TcpClient.Send;
  2. DataHandlingAdapter.PreviewSend;(进入数据处理适配器)
  3. DataHandlingAdapter.GoSend;(通过数据处理适配器封装数据)
  4. Socket.Send;(通过Socket发送数据)

    非独立线程异步发送(SendAsync)

    使用
    TcpClient已经内置了三种异步发送方法,直接调用就可以发送。如果发送失败,会抛出异常。

    1. public virtual void SendAsync(byte[] buffer);
    2. public virtual void SendAsync(ByteBlock byteBlock);
    3. public virtual void SendAsync(byte[] buffer, int offset, int length);

    调用顺序

  5. TcpClient.Send;

  6. DataHandlingAdapter.PreviewSend;(进入数据处理适配器)
  7. DataHandlingAdapter.GoSend;(通过数据处理适配器封装数据)
  8. Socket.BeginSend

    独立线程异步发送

    说明
    独立线程异步发送数据顾名思义,就是采用单独的线程完成发送操作,其整体发送效率较高。如果发送失败,会通过 日志输出不会触发异常

使用
使用与TcpClient异步发送一致,只需在配置中注入TcpClientConfig.SeparateThreadSendProperty的值为True即可。如果发送失败,会通过 日志输出不会触发异常

  1. public virtual void SendAsync(byte[] buffer);
  2. public virtual void SendAsync(ByteBlock byteBlock);
  3. public virtual void SendAsync(byte[] buffer, int offset, int length);

1.2 调用顺序

  1. TcpClient.Send;
  2. DataHandlingAdapter.PreviewSend;(进入数据处理适配器)
  3. DataHandlingAdapter.GoSend;(通过数据处理适配器封装数据)
  4. AsyncSender.AsyncSend;(通过AsyncSend把数据压入队列,同时唤醒发送线程)
  5. AsyncSender.tryGet;(从队列获取待发送数据,并将小数据压缩至已设置的长度)
  6. Socket.SendAsync;(通过Socket IOCP发送数据)

    视频介绍

    点击查看【bilibili】