跳到主要内容
版本:4.0-beta

创建TcpClient

定义

定义

命名空间:
TouchSocket
程序集:
安装:
dotnet add package TouchSocket

一、说明

TcpClient是Tcp系客户端基类,他直接参与tcp的连接、发送、接收、处理、断开等,他的业务与服务器的TcpSessionClient是一一对应的。

二、特点

  • 简单易用。
  • IOCP多线程。
  • 内存池支持
  • 高性能
  • 适配器预处理,一键式解决分包粘包、对象解析(如HTTP,Json)等。
  • 超简单的同步发送、异步发送、接收等操作。
  • 基于委托、插件驱动,让每一步都能执行AOP。

三、产品应用场景

  • 所有Tcp基础使用场景:可跨平台、跨语言使用。
  • 自定义协议解析场景:可解析任意数据格式的TCP数据报文。

四、可配置项

4.1 目标服务器地址

TcpClient必须指定远程服务器地址,否则无法连接。

链接到的远程IPHost,支持域名。支持类型:

  1. 使用IPv4,传入形如:127.0.0.1:7789的字符串即可。
  2. 使用IPv6,传入形如:[*::*]:7789的字符串即可。
  3. 使用域名,必须包含协议类型,形如:https://touchsocket.net/或者http://touchsocket.net:80
  4. 使用IPv6域名,必须包含协议类型,形如:http://[*::*]:80
🔄 正在加载代码...
提示

建议在配置时,使用规范的名称体制,例如:tcp://127.0.0.1:7789http://127.0.0.1:7789等。

4.2 SSL加密设置

TcpClient支持SSL加密连接。只需要在配置时,调用SetClientSslOption方法,传入ClientSslOption实例即可。

🔄 正在加载代码...
提示

当远程服务器使用的证书是信任机构颁发的证书(例如:在阿里云、腾讯云等平台签发的),且在设置远程服务器地址时,使用了httpswssssltls等协议头时(例如:https://touchsocket.net/),则会使用默认的Ssl配置。无需再设置ClientSslOption

4.3 设置Tcp底层心跳

TcpClient支持Tcp底层心跳设置。只需要在配置时,调用SetKeepAliveValue方法即可。

🔄 正在加载代码...
注意
  1. 此配置项仅在windows下有效。
  2. 非必要请勿开启。这个设置不能代替常规心跳包。因为Tcp心跳包的发送是由操作系统控制的,应用程序无法干预。

4.4 固定客户端端口号

TcpClient支持固定客户端端口号。只需要在配置时,调用SetBindIPHost方法即可。

🔄 正在加载代码...

4.5 Tcp客户端端口复用

TcpClient支持端口复用。只需要在配置时,调用UseReuseAddress方法即可。

🔄 正在加载代码...

4.6 设置Socket的NoDelay属性

TcpClient支持设置Socket的NoDelay属性。只需要在配置时,调用UseNoDelay方法即可。

🔄 正在加载代码...

五、支持插件

插件方法功能
ITcpConnectingPlugin此时Socket实际上已经完成连接,但是并没有启动接收,然后触发。
ITcpConnectedPlugin同意连接,且成功启动接收后触发
ITcpClosingPlugin当客户端主动调用Close时触发
ITcpClosedPlugin当客户端断开连接后触发
ITcpReceivingPlugin在收到原始数据时触发,所有的数据均在ByteBlock里面。
ITcpReceivedPlugin在收到适配器数据时触发,根据适配器类型,数据可能在ByteBlock或者IRequestInfo里面。
ITcpSendingPlugin当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。

六、创建TcpClient

6.1 简单创建

简单的处理逻辑可通过ConnectedClosedReceived等委托直接实现。

代码如下:

🔄 正在加载代码...

6.2 继承实现

一般继承实现的话,可以从TcpClient继承。如果有特殊需求,也可以从TcpClientBase继承。

🔄 正在加载代码...

七、接收数据

TcpClient中,接收数据的方式有很多种。多种方式可以组合使用。

7.1 Received委托处理

当使用TcpClient创建客户端时,内部已经定义好了一个外置委托Received,可以通过该委托直接接收数据。

🔄 正在加载代码...

7.2 继承TcpClient重写接收逻辑

如6.2所示,如果需要更自定义的接收逻辑,可以从TcpClient继承,然后重写OnTcpReceived方法。

7.2 插件处理

按照TouchSocket的设计理念,使用插件处理数据,是一项非常简单,且高度解耦的方式。步骤如下:

(1)声明插件

插件可以先继承PluginBase,然后再实现需要的功能插件接口,可以按需选择泛型或者非泛型实现。

如果已经有继承类,直接实现IPlugin接口即可。

🔄 正在加载代码...

(2)创建使用插件处理的客户端

🔄 正在加载代码...

7.3 异步阻塞接收

异步阻塞接收,即使用await的方式接收数据。其特点是能在代码上下文中,直接获取到收到的数据。例如:

🔄 正在加载代码...
提示

异步阻塞接收,在等待接收数据时,不会阻塞线程资源,所以即使大量使用,也不会影响性能。

八、发送数据

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

🔄 正在加载代码...
提示

框架不仅内置了字节的发送,也扩展了字符串等常见数据的发送。而且还包括了TrySend等不会抛出异常的发送方法。

注意

所有的发送,框架内部实际上只实现了异步发送,但是为了兼容性,仍然保留了同步发送的扩展。但是强烈建议如有可能,请务必使用异步发送来提高效率

九、断线重连

断线重连,即tcp客户端在断开服务器后,主动发起的再次连接请求。

9.1 启用断线重连

断线重连,依靠的是Tcp断开后,或者初始化后,Online属性为false时,会尝试连接。

所以,重连机制在Setup完成后,即会生效。

🔄 正在加载代码...
注意

断线重连,必须满足以下几个要求:

  1. 必须有显式的断开信息,也就是说,直接拔网线的话,不会立即生效,会等tcp保活到期后再生效。此处可以结合健康活性检验插件来绝对保活。
提示

UseReconnection插件,可以通过设置SetActionForCheck,自己规定检查活性的方法。默认情况下,只会检验Online属性,所以无法检验出断网等情况。如果自己控制,则可以发送心跳包,以保证在线状态。

9.2 暂停重连

适用于重连的客户端,都提供了SetPauseReconnection方法,可以暂停或者恢复重连。

🔄 正在加载代码...

十、示例Demo