创建TcpService
定义
命名空间:TouchSocket.Sockets
程序集:TouchSocket.dll
一、说明
TcpService是Tcp系服务器基类,它不参与实际的数据交互,只是配置、激活、管理、注销、重建SessionClient类实例。而SessionClient是当**TcpClient(客户端)**成功连接服务器以后,由服务器新建的一个实例类,后续的所有通信,也都是通过该实例完成的。
二、特点
- 简单易用。
- IOCP多线程。
- 内存池支持
- 高性能(实测服务器单客户端单线程,每秒可接收200w条8字节的信息,接收数据流量可达3GB/s)。
- 多地址监听(可以一次性监听多个IP及端口)
- 适配器预处理,一键式解决分包、粘包、对象解析(如HTTP,Json)等。
- 超简单的同步发送、异步发送、接收等操作。
- 基于委托、插件驱动,让每一步都能执行AOP。
2.1 吞吐量性能测试
如下图所示,使用最简单数据接收,不做任何处理。数据吞吐量可达3Gb。 测试Demo示例

2.2 连接性能测试
如下图所示,使用最简单连接测试,不做任何处理。建立1000本地连接仅需0.1秒。 测试Demo示例

三、产品应用场景
- 所有Tcp基础使用场景:可跨平台、跨语言使用。
- 自定义协议解析场景:可解析任意数据格式的TCP数据报文。
四、服务器架构
4.1 连接架构
服务器在收到新客户端连接时,会创建一个SessionClient的派生类实例,与客户端TcpClient一一对应,后续的数据通信均由此实例负责。
SessionClient在Service里面以字典映射。ID为键,SessionClient本身 为值。
4.2 Scoped 生命周期
TcpService
在支持Scoped的IOC
容器中工作时,也是支持Scoped
区域划分的。
一般情况下,TcpService
在Setup
时,首先会创建一个Scoped
区域,用于整个TcpService
的生命周期。在TcpService
释放(Dispose
)时释放。
然后,当有新客户端连接后,会为每个SessionClient
的派生类实例也创建一个Scoped
区域,用于SessionClient
的生命周期。当连接断开时,会释放此区域。
五、可配置项
可配置项
SetMaxPackageSize
数据包最大值(单位:byte),默认1024×1024×10。该值会在适当时间,直接作用DataHandlingAdapter.MaxPackageSize。
SetGetDefaultNewId
配置初始Id的分配策略。
SetListenIPHosts
设置统一的监听IP和端口号组,可以一次性设置多个地址。
SetListenOptions
设置独立的监听IP和端口号,可以独立控制当前地址监听的个性化配置。
SetServerName
服务器标识名称,无实际使用意义。
SetBacklogProperty
Tcp半连接挂起连接队列的最大长度。默认为30
SetMaxCount
最大可连接数,默认为10000
SetServiceSslOption
Ssl配置,为Null时则不启用。
UseNoDelay
设置Socket的NoDelay属性,默认false。
UseReuseAddress
启用端口复用。该配置可在服务器、或客户端在监听端口时,运行监听同一个端口。可以一定程度缓解端口来不及释放的问题。
SetSendTimeout
设置发送超时时间,默认0ms,即禁用该配置。
六、支持插件
插件方法 | 功能 |
---|---|
ITcpConnectingPlugin | 此时Socket实际上已经完成连接,但是并没有启动接收,然后触发。 |
ITcpConnectedPlugin | 同意连接,且成功启动接收后触发 |
ITcpClosingPlugin | 当客户端主动调用Close时触发 |
ITcpClosedPlugin | 当客户端断开连接后触发 |
ITcpReceivingPlugin | 在收到原始数据时触发,所有的数据均在ByteBlock里面。 |
ITcpReceivedPlugin | 在收到适配器数据时触发,根据适配器类型,数据可能在ByteBlock或者IRequestInfo里面。 |
ITcpSendingPlugin | 当即将发送数据时,调用该方法在适配器之后,接下来即会发送数据。 |
IIdChangedPlugin | 当SessionClient的Id发生改变时触发。 |