AutoCSer2 是基于 TCP 长连接支持全双工的高性能 RPC 框架(下载 AutoCSer2.Example.zip)。

最低支持 .NET Standard 2.0,低框架版本请到 AutoCSer 下载以支持 .NET Framework 2.0(注意这两个框架版本是不兼容的)

AutoCSer 的 TCP 接口服务框架 一样,该框架服务端与客户端都采用接口原型定义模式,主要不同点是该框架为 await / async 异步编程提供了更多原生支持。

服务

AutoCSer.Net.CommandListener

一个服务实例由一个 AutoCSer.Net.CommandListener 对象定义,需要指定一个服务配置 AutoCSer.Net.CommandServerConfig 用于定义各种参数与自定义行为,至少需要指定 1 个服务控制器用于提供服务接口。
第一个绑定的服务控制器接口为服务主控制器,可以定义服务认证 API,作为客户端访问服务其它 API 之前的身份认证以及会话状态初始化操作,每个服务最大支持 8192 个服务控制器。
每一个服务控制器由一个其它程序集可见的 public 接口定义与一个接口实例组成,服务控制器接口定义仅支持非泛型方法作为 API 定义,一个服务控制器接口最大支持 65536 个 API 方法定义,主服务主控制器只最大支持 65280 个 API 方法定义。

参考示例 AutoCSer2\Example2\CommandServer\Server\Listener.cs

服务控制器接口方法

服务控制器接口方法根据调用线程模式分为四大类型:

一.IO 线程同步调用,直接在 Socket 接收数据的 IO 回调线程中调用服务端方法,没有线程切换开销,可以保证单个客户端连接没有并发问题,是最高效也是最危险的调用模式,所以仅适合轻量级无阻塞方法调用,因为 IO 线程被阻塞会严重影响系统吞吐性能甚至可能产生死锁问题。
根据返回数据线程模式分为 4 种类型:

1.同步返回数据,支持 ref / out 参数。

参考示例 AutoCSer2\Example2\CommandServer\Server\Synchronous\ISynchronousController.cs

2.不返回数据,仅执行服务端方法不应答客户端,适合客户端单向给服务端推送可丢失数据的场景,返回值类型必须为 AutoCSer.Net.CommandServerSendOnly

参考示例 AutoCSer2\Example2\CommandServer\Server\Synchronous\ISendOnlyController.cs

3.回调委托返回数据,使用回调委托返回数据,服务端必须保证触发回调,否则客户端可能会一直等待到连接关闭,返回值类型必须为 void,最后一个参数类型必须为 AutoCSer.Net.CommandServerCallback / AutoCSer.Net.CommandServerCallback<T>

参考示例 AutoCSer2\Example2\CommandServer\Server\Synchronous\ICallbackController.cs

4.保持回调委托返回数据,用于客户端建立服务端推送可丢失数据通道的场景,返回值类型必须为 void,根据回调是否等待计数输出分为两种:
不限制计数回调采用同步无阻塞高效率模式,适合回调调用频率低于网络吞吐的场景,否则可能造成输出数据积压内存占用不可预计并影响系统性能,最后一个参数类型必须为 AutoCSer.Net.CommandServerKeepCallback / AutoCSer.Net.CommandServerKeepCallback<T>
等待计数模式采用异步任务模式触发回调,会在输出数据积压超过指定数量时等待网络输出避免占用过多内存资源,最后一个参数类型必须为 AutoCSer.Net.CommandServerKeepCallbackCount / AutoCSer.Net.CommandServerKeepCallbackCount<T>,由于该回调仅支持 async Task 异步回调,不建议在当前线程模式下使用。

参考示例 AutoCSer2\Example2\CommandServer\Server\Synchronous\IKeepCallbackController.cs

二.同步队列线程调用,在同步线程队列中调用方法,可以保证每个队列的调用没有并发问题,由于每个队列都需要占用一个常驻线程,所以除了每个服务控制器可以配置一个默认队列线程,最多支持 255 个附加队列。由于方法采用队列模式调用,所以仅适合纯内存计算任务,不适合阻塞任务。
要求 API 方法的数据参数之前增加一个类型为 AutoCSer.Net.CommandServerCallQueue 或者 AutoCSer.Net.CommandServerCallLowPriorityQueue 的参数,通过 ContextObject 设置或者获取当前队列的上下文信息,区别在与前者比后者拥有更高优先级的执行概率。
IO 线程同步调用一样,根据返回数据线程模式分为 4 种类型:

1.同步返回数据,支持 ref / out 参数。

参考示例 AutoCSer2\Example2\CommandServer\Server\Queue\ISynchronousController.cs

2.不返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\Queue\ISendOnlyController.cs

3.回调委托返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\Queue\ICallbackController.cs

4.保持回调委托返回数据
由于等待计数回调模式仅支持 async Task 异步回调,不建议在当前线程模式下使用。

参考示例 AutoCSer2\Example2\CommandServer\Server\Queue\IKeepCallbackController.cs

三.async Task 调用,采用系统异步任务调度,适合大量异步任务并发调用,应当尽量避免同步阻塞调用的存在。
要求 API 方法的返回值类型为 async Task 或者 async Task<T>,根据返回数据线程模式分为 3 种类型:

1.await Task 同步返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\AsyncTask\ISynchronousController.cs

2.不返回数据,返回值类型必须为 Task<AutoCSer.Net.CommandServerSendOnly>

参考示例 AutoCSer2\Example2\CommandServer\Server\AsyncTask\ISendOnlyController.cs

3.保持回调委托返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\AsyncTask\IKeepCallbackController.cs

四.async Task 读写队列调用,采用异步读写队列任务调度,每一个队列在提供读操作并发调用的同时保证写操作没有并发问题,适合 Actor 模式大量队列并发执行(比如每个业务用户一个执行队列)。
要求 API 方法的数据参数之前增加一个类型为 AutoCSer.Net.CommandServerCallTaskQueue 或者 AutoCSer.Net.CommandServerCallTaskLowPriorityQueue 的参数,通过字段 ContextObject 设置或者获取当前队列的上下文信息,区别在于前者比后者拥有更高优先级的执行概率。
要求 API 方法存在一个实现接口 IEquatable<T> 的数据参数用于标识队列关键字,如果没有找到 [AutoCSer.Net.CommandServerQueueKey] 标识的参数则默认采用 API 第一个数据参数作为队列关键字参数,不论是关键字不同还是关键字类型不同都是不同的执行队列。
await Task 调用一样,要求 API 方法的返回值类型为 async Task 或者 async Task<T>,根据返回数据线程模式分为 3 种类型:

1.await Task 同步返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\AsyncTaskQueue\ISynchronousController.cs

2.不返回数据,返回值类型必须为 Task<AutoCSer.Net.CommandServerSendOnly>

参考示例 AutoCSer2\Example2\CommandServer\Server\AsyncTaskQueue\ISendOnlyController.cs

3.保持回调委托返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\AsyncTaskQueue\IKeepCallbackController.cs

服务认证 API

服务主控制器允许存在一个返回数据类型为 AutoCSer.Net.CommandServerVerifyState 的 API 作为服务认证 API,客户端在通过该 API 调用之前是不允许调用其它 API 的。
每一个 API 方法在所有参数之前都可以增加一个 AutoCSer.Net.CommandServerSocket 参数通过字段 SessionObject 设置或者获取当前连接会话的上下文信息,一般操作是在服务认证 API中初始化该对象,在其它 API 中获取该对象。
服务认证 API 仅支持一下线程模式:
1. IO 线程同步调用 / 同步队列线程调用 + 同步返回数据 / 回调委托返回数据
2. async Task 调用 / async Task 读写队列调用 + await Task 同步返回数据

参考示例 AutoCSer2\Example2\CommandServer\Server\IVerifyController.cs

接口方法配置,每个接口 API 都可以指定一个配置 [AutoCSer.Net.CommandServerMethod] 用于定义接口配置参数。

MethodIndex 自定义命令序号,用于客户端识别服务端 API 的路由,同一个控制器接口中不允许重复,默认小于 0 表示采用自动匹配模式,自动匹配模式不能保证服务端修改升级以后旧的客户端调用路由能与新的服务端路由匹配。存在自定义需求时不要使用巨大的数据,建议从 0 开始,因为它会是某个数组的大小。

IsInitobj 默认为 true 对输入输出参数进行初始化,如果采用二进制序列化或者可以允许随机初始化数据可以设置为 false 以降低反序列化开销。

KeepCallbackOutputCount 保持回调输出计数,用于等待计数的保持回调 API 设置,默认为 1 无法批量输出数据,内部服务高频调用场景建议根据具体业务数据以及输出缓存区大小设置合适值以提高吞吐量并控制内存占用。

IsOutputPool 输出对象是否采用缓存池,默认为 false,频繁调用输出接口建议设置为 true。

QueueIndex 同步队列序号,默认为 0 表示控制器独立队列,否则为当前服务的共享队列。

IsOfflineCount 是否启用服务下线通知计数逻辑,用于单例服务注册等待所有任务完成以后下线并通知新服务上线,保持回调相关接口不等待异步回调完成。

IsExpired 是否过期。

服务配置

AutoCSer.Net.CommandServerConfig

* Host 服务监听主机与端口信息

ServiceName 服务名称,服务注册唯一标识,没有用到服务注册的时候仅用于日志输出

ReceiveBufferSizeBits 接收数据缓存区池字节大小二进制位数量,默认 17 为 128KB,开放服务建议值不大于 12 避免内存占用过多

MaxInputSize 最大输入数据字节数,默认为 0 表示不限制,开放服务建议值小于 2^ReceiveBufferSizeBis - 12 而且不建议 API 产生大对象传输行为

SendBufferSizeBits 发送数据缓存区池字节大小二进制位数量,默认为 17 为 128KB,开放服务建议值不大于 12 避免内存占用过多

SendBufferMaxSize 发送数据缓冲区最大字节数,默认为 0 表示不限制,开放服务建议值不大于 1MB

MinCompressSize 发送数据启用压缩最低字节数量,默认为 0 表示不压缩数据;压缩数据需要消耗一定的 CPU 资源降低带宽使用

IsBuildOutputThread 输出是否采用新开线程模式建议默认为 true 避免本地 IO 调用同步完成导致输出串行化的问题,如果不存在本地 127.0.0.1 客户端调用可以尝试设置为 false 以避免输出线程调度(如果造成并发性能故障请还原设置为 true)

SocketAsyncEventArgsMaxCount 套接字异步事件对象缓存数量,默认为 256,开放服务建议值大于 1024

VerifyTimeoutSeconds 认证超时秒数,默认为 4

MaxVerifyDataSize 最大认证数据字节数量,默认为 256 字节

MaxVerifyMethodErrorCount 最大认证失败次数,异步认证也可能当成失败处理,默认为 2

MinSocketSize 接收发送数据不完整时连续两次最小字节数,默认为 1,开放服务建议值为 512 避免客户端慢攻击

BinaryDeserializeMaxArraySize 二进制反序列化数组最大长度,默认为 0 表示不限制,开放服务建议根据实际情况设置防止内存占用攻击,大数组建议拆分循环调用发送或者保持回调模式接收

QueueTimeoutSeconds 同步队列任务执行超时检查秒数,默认为 0 表示不检查,用于检查队列任务是否存在长时间阻塞或者死锁问题

TaskQueueMaxConcurrent 异步读写队列最大读操作并发任务数量,默认为 16,设置为 1 表示纯队列模式,由于写操作需要等待所有未完成读取操作结束以后才能执行,所以并发读取任务数量不宜过大避免造成写操作等待时间过长

TaskQueueWaitCount 异步读写队列写操作等待读取操作任务数量,默认为 16,最小值为 1,等待读取操作任务数量不宜过大避免造成写操作等待时间过长

TaskQueueTimeoutSeconds 异步读写队列驻留超时秒数,默认为 60 表示等待指定时间以后没有新任务再删除队列,设置为 0 表示队列任务执行完以后立即删除队列避免占用内存,设置为负数表示永久驻留内存

Log 日志处理实例 AutoCSer.ILog 默认为 AutoCSer.LogHelper.Default,可重写

Verify 方法用于验证套接字,比如 IP 地址,默认返回 true,可重写

IgnoreVerifyMethod 方法用于非主控制器存在认证 API 警告,可重写

GetRegistrar 方法用于获取服务注册组件,默认返回 new AutoCSer.Net.CommandServiceRegistrar(server),服务初始化时一次性调用,可重写

GetTaskQueueTypeSet 方法用于创建异步读写队列管理,默认返回 new AutoCSer.Net.CommandServerCallTaskQueueTypeSet(server),服务初始化时一次性调用,可重写

OnQueueTimeout 方法用于队列任务执行超时通知,可重写

Decompress 方法用于解压缩接收数据,可重写

Compress 方法用于压缩发送数据,可重写

GetBinaryDeserializeConfig 方法用于获取二进制反序列化配置参数,服务初始化时一次性调用,可重写

OnControllerConstructorMessage 方法用于控制器构造警告,可重写

OnCustomData 方法用于自定义数据处理,默认返回 AutoCSer.Net.CommandServer.ServerReceiveErrorType.CustomCommandError 并关闭当前套接字(注意,由于是接收数据 IO 线程同步调用,如果存在阻塞请新开线程任务处理),可重写

客户端

AutoCSer.Net.CommandClient

一个客户端实例由一个 AutoCSer.Net.CommandClient 对象定义,需要指定一个客户端配置 AutoCSer.Net.CommandClientConfig 用于定义各种参数与自定义行为。
客户端需要设置与服务端匹配的客户端控制器接口,如果服务端主控制器存在服务认证 API,客户端初始化时必须提供配套的主控制器接口,并且在客户端套接字事件中配置认证 API 调用逻辑。
每一个客户端控制器接口都必须是与服务端控制器接口完全匹配的,其它程序集可见的 public 接口定义,所以同样仅支持非泛型方法定义,对于同一个服务 API 允许定义多个匹配的客户端接口方法。

参考示例 AutoCSer2\Example2\CommandServer\Client\Client.cs

客户端控制器接口方法

客户端控制器接口方法根据数据回调线程模式分为 10 种模式:

1.同步等待,阻塞调用线程,返回值类型必须为 AutoCSer.Net.CommandClientReturnType 或者 AutoCSer.Net.CommandClientReturnValue<T>,不推荐使用。
支持 ref / out 参数,可匹配服务端同步返回数据 API,如果不存在 ref / out 参数还可以匹配服务端回调委托返回数据 API。

2.回调委托返回数据,返回值类型必须为 AutoCSer.Net.CallbackCommand,只能用于异步 await 调用上下文。
接口方法最后一个参数必须是 AutoCSer.Net.CommandClientCallback / Action<AutoCSer.Net.CommandClientReturnType> 或者 AutoCSer.Net.CommandClientCallback<T> / Action<AutoCSer.Net.CommandClientReturnValue<T>>
可以通过 [AutoCSer.Net.CommandClientMethod(CallbackType = xxx)] 配置执行回调委托的线程模式,默认采用 Task.Run 执行回调委托。
可以匹配服务端同步返回数据回调委托返回数据 API。

3.同步队列任务回调委托返回数据,返回值类型必须为 AutoCSer.Net.CallbackCommand,只能用于异步 await 调用上下文。
接口方法最后一个参数必须是 AutoCSer.Net.CommandClientCallbackQueueNode / Action<AutoCSer.Net.CommandClientReturnType, AutoCSer.Net.CommandClientCallQueue> 或者 AutoCSer.Net.CommandClientCallbackQueueNode<T> / Action<AutoCSer.Net.CommandClientReturnValue, AutoCSer.Net.CommandClientCallQueue<T>>
可以保证回调委托的执行没有并发问题,不适合存在阻塞的回调操作。
可以匹配服务端同步返回数据回调委托返回数据 API。

4.await 同步等待回调,返回值类型必须为 AutoCSer.Net.ReturnCommand 或者 AutoCSer.Net.ReturnCommand<T>,只能用于异步 await 调用上下文。
可以通过 [AutoCSer.Net.CommandClientMethod(CallbackType = xxx)] 配置执行回调委托的线程模式,默认采用 Task.Run 执行回调委托。
可以匹配服务端同步返回数据回调委托返回数据 API。

5.await 同步等待同步队列任务回调,返回值类型必须为 AutoCSer.Net.ReturnQueueCommand 或者 AutoCSer.Net.ReturnQueueCommand<T>,只能用于异步 await 调用上下文。
仅仅采用同步队列任务触发回调,并不能保证以队列模式执行后续操作,不适合存在阻塞的 await 后续操作。
可以匹配服务端同步返回数据回调委托返回数据 API。

参考示例 AutoCSer2\Example2\CommandServer\Client\Synchronous\ISynchronousController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\Synchronous\ICallbackController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\Queue\ISynchronousController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\Queue\ICallbackController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\AsyncTask\ISynchronousController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\AsyncTaskQueue\ISynchronousController.cs

6.只发送数据,返回值类型必须为 AutoCSer.Net.SendOnlyCommand,只能用于异步 await 调用上下文。
只能匹配服务端不返回数据 API。

参考示例 AutoCSer2\Example2\CommandServer\Client\Synchronous\ISendOnlyController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\Queue\ISendOnlyController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\AsyncTask\ISendOnlyController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\AsyncTaskQueue\ISendOnlyController.cs

7.保持回调委托返回数据,返回值类型必须为 AutoCSer.Net.KeepCallbackCommand,只能用于异步 await 调用上下文。
接口方法最后一个参数必须是 AutoCSer.Net.CommandClientKeepCallback / Action<AutoCSer.Net.CommandClientReturnType, AutoCSer.Net.KeepCallbackCommand> 或者 AutoCSer.Net.CommandClientKeepCallback<T> / Action<AutoCSer.Net.CommandClientReturnValue, AutoCSer.Net.KeepCallbackCommand<T>>
可以通过 [AutoCSer.Net.CommandClientMethod(CallbackType = xxx)] 配置执行回调委托的线程模式,默认采用 Task.Run 执行回调委托。
只能匹配服务端保持回调委托返回数据 API。

8.同步队列任务保持回调委托返回数据,返回值类型必须为 AutoCSer.Net.KeepCallbackCommand,只能用于异步 await 调用上下文。
接口方法最后一个参数必须是 AutoCSer.Net.CommandClientKeepCallbackQueue / Action<AutoCSer.Net.CommandClientReturnType, AutoCSer.Net.CommandClientCallQueue, AutoCSer.Net.KeepCallbackCommand> 或者 AutoCSer.Net.CommandClientKeepCallbackQueue<T> / Action<AutoCSer.Net.CommandClientReturnValue<T>>, AutoCSer.Net.CommandClientCallQueue, AutoCSer.Net.KeepCallbackCommand<T>>
可以保证回调委托的执行没有并发问题,不适合存在阻塞的回调操作。
只能匹配服务端保持回调委托返回数据 API。

9.await 同步等待保持回调,返回值类型必须为 AutoCSer.Net.EnumeratorCommand 或者 AutoCSer.Net.EnumeratorCommand<T>,只能用于异步 await 调用上下文。
在 .NET Satndard 2.0 中通过 await MoveNext() 方法与 Current 属性模拟 IAsyncEnumerable 接口。
可以通过 [AutoCSer.Net.CommandClientMethod(CallbackType = xxx)] 配置执行回调委托的线程模式,默认采用 Task.Run 执行回调委托。
只能匹配服务端保持回调委托返回数据 API。

10.await 同步等待同步队列任务保持回调,返回值类型必须为 AutoCSer.Net.EnumeratorQueueCommand 或者 AutoCSer.Net.EnumeratorQueueCommand<T>,只能用于异步 await 调用上下文。
在 .NET Satndard 2.0 中通过 await MoveNext() 方法与 Current 属性模拟 IAsyncEnumerable 接口。
仅仅采用同步队列任务触发回调,并不能保证以队列模式执行后续操作,不适合存在阻塞的 await 后续操作。
只能匹配服务端保持回调委托返回数据 API。

参考示例 AutoCSer2\Example2\CommandServer\Client\Synchronous\IKeepCallbackController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\Queue\IKeepCallbackController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\AsyncTask\IKeepCallbackController.cs

参考示例 AutoCSer2\Example2\CommandServer\Client\AsyncTaskQueue\IKeepCallbackController.cs

注意:匹配服务端同步返回数据 API 的客户端回调线程模式同样可以匹配服务端await 同步返回数据 API。

接口方法配置,每个 API 接口都可以指定一个配置 [AutoCSer.Net.CommandClientMethod] 用于定义接口配置参数。

MethodIndex 自定义命令序号,同一个控制器接口中不允许重复,默认小于 0 表示采用自动匹配模式。存在自定义需求时不要使用巨大的数据,建议从 0 开始,因为它会是某个数组的大小。

CallbackType 数据回调线程模式,默认为 Task.Run

IsInitobj 默认为 true 对输入输出参数进行初始化,如果采用二进制序列化或者可以允许随机初始化数据可以设置为 false 以降低反序列化开销。

TimeoutSeconds 调用超时秒数,默认为 0 表示不超时,最大值为客户端配置 CommandMaxTimeoutSeconds

QueueIndex 同步队列序号。

IsLowPriorityQueue 是否低优先级同步队列队列。

MatchMethodName 匹配服务端方法名称,用于自动命令序号模式下客户端改写方法名称时指定匹配的服务端方法名称。

客户端配置

AutoCSer.Net.CommandClientConfig

* Host 服务监听主机与端口信息

ServiceName 服务名称,服务注册唯一标识,没有用到服务注册的时候仅用于日志输出

ReceiveBufferSizeBits 接收数据缓存区池字节大小二进制位数量,默认 17 为 128KB,开放服务建议值不大于 12 避免内存占用过多

MaxInputSize 最大输入数据字节数,默认为 0 表示不限制,开放服务建议值小于 2^ReceiveBufferSizeBis - 12 而且不建议 API 产生大对象传输行为

SendBufferSizeBits 发送数据缓存区池字节大小二进制位数量,默认为 17 为 128KB,开放服务建议值不大于 12 避免内存占用过多

SendBufferMaxSize 发送数据缓冲区最大字节数,默认为 1MB

MinCompressSize 发送数据启用压缩最低字节数量,默认为 0 表示不压缩数据;压缩数据需要消耗一定的 CPU 资源降低带宽使用

CommandMaxTimeoutSeconds 命令调用最大超时秒数,默认为 0 表示无超时逻辑并且接口定义 TimeoutSeconds 超时无效

CommandQueueCount 最大未处理命令数量,默认为 65536,超过指定值将阻塞调用直到低于指定值避免占用过多内存

CheckSeconds 单向心跳包间隔时间默认为 1 秒,对于频率稳定可靠的服务类型可以设置为 0 禁用心跳包,开放服务建议值为 60

QueueTimeoutSeconds 同步队列任务执行超时检查秒数,默认为 0 表示不检查,用于检查队列任务是否存在长时间阻塞或者死锁问题

VerifyErrorCount 创建新客户端认证连续失败尝试次数,默认为 4

CommandPoolBits 命令池初始化二进制大小,最大值为 16,最小值为 2,默认为 8 容器大小为 256,内部高频服务建议值为 16 容器大小为 65536,开放服务建议值为 3 容器大小为 8

IsAutoSocket 默认为 true 表示在创建客户端对象的时候自动启动连接,否则需要第一次调用触发

* GetSocketEvent 获取命令客户端套接字事件,默认为 new CommandClientSocketEvent(commandClient),客户端初始化时一次性调用,可重写

Log 日志处理实例 AutoCSer.ILog 默认为 AutoCSer.LogHelper.Default,可重写

AutoCreateSocket 方法用于启用服务注册以后重写自动启动连接逻辑,可重写

GetRegistrar 方法用于获取服务注册客户端监听组件,默认为 new AutoCSer.Net.CommandClientServiceRegistrar(commandClient),客户端初始化时一次性调用,可重写

OnQueueTimeout 方法用于队列任务执行超时通知,可重写

Decompress 方法用于解压缩接收数据,可重写

Compress 方法用于压缩发送数据,可重写

GetBinaryDeserializeConfig 获取二进制反序列化配置参数,客户端初始化时一次性调用,可重写

OnControllerConstructorMessage 方法用于控制器构造警告,可重写

OnCustomData 方法用于自定义数据处理,默认返回 AutoCSer.Net.CommandServer.ClientReceiveErrorType.CustomCommandError 并关闭当前套接字(注意,由于是接收数据 IO 线程同步调用,如果存在阻塞请新开线程任务处理),可重写

参考示例 AutoCSer2\Example2\CommandServer\Client\CommandClientConfig.cs

客户端套接字事件

AutoCSer.Net.CommandClientSocketEvent

* 该对象非常重要,用于监视客户端连接状态的变化,对客户端的自定义扩展操作基本都需要用到它。

Socket 通过认证 API 的当前命令客户端套接字,该对象会随着断线重连而变化

ControllerCreatorParameters 客户端控制器创建参数集合,用于命令客户端套接字初始化是创建客户端控制器对象,同时也用于命令客户端套接字事件在通过认证 API 之后根据客户端控制器接口类型自动绑定控制器属性

* CallVerifyMethod 方法用于客户端创建套接字连接以后调用认证 API,服务端存在认证 API 是必须重写

* OnMethodVerified 方法用于命令客户端套接字通过认证 API 以后的客户端初始化操作,默认操作为重置当前套接字与自动绑定客户端控制器操作并通知等待连接的调用者,可重写(此调用位于客户端锁操作中,应尽快未完成初始化操作,禁止调用内部嵌套锁操作避免死锁)

* onMethodVerified 方法用于命令客户端套接字通过认证 API 并自动绑定客户端控制器以后的客户端自定义初始化操作,用于手动绑定设置客户端控制器与连接初始化操作,比如初始化保持回调,可重写(此调用位于客户端锁操作中,应尽快未完成初始化操作,禁止调用内部嵌套锁操作避免死锁)

Create 方法用于重新创建新的套接字通知,默认操作为通知等待当前连接的调用者,可重写(此调用位于客户端锁操作中,应尽快未完成初始化操作,禁止调用内部嵌套锁操作避免死锁)

OnDisposeClient 方法用于关闭客户端通知,默认操作为通知等待连接的调用者,可重写(此调用位于客户端锁操作中,应尽快未完成初始化操作,禁止调用内部嵌套锁操作避免死锁)

OnClosed 方法用于关闭命令客户端当前套接字通知,默认操作为通知等待当前连接的调用者,可重写(此调用位于客户端锁操作中,应尽快未完成初始化操作,禁止调用内部嵌套锁操作避免死锁)

OnCreateError 方法用于命令客户端套接字创建连接失败通知,默认操作为通知等待连接的调用者,同一个命令客户端套接字对象可能存在多次调用,可重写(此调用位于客户端锁操作中,应尽快未完成初始化操作,禁止调用内部嵌套锁操作避免死锁)

OnCreateSocketException 方法用于套接字创建异常提示,可重写

OnCreateSocketRetrySuccess 方法用于套接字重试连接成功提示,可重写

CreateSocketSleep 方法用于创建套接字失败重试休眠,默认第 1 次失败以后休眠 10ms,第 2 次失败以后休眠 100ms,第 3 次失败以后休眠 1s,以后每次失败都休眠 5s,可重写

ControllerLessError 方法用于接收服务端控制器数据失败通知,可重写

ControllerCountError 方法用于控制器数量与预计数量不匹配通知,可重写

NotFoundControllerName 方法用于没有找到服务端控制器名称通知,可重写

ControllerNameError 方法用于主控制器名称与服务端名称不匹配通知,可重写

ControllerMethodCountError 方法用于控制器方法数量超出服务端限制通知,可重写

对于只有一个服务控制器的服务,客户端可以配置 AutoCSer.Net.CommandClientSocketEvent<T> 对象通过 InterfaceController 属性获取当前客户端控制器。

对于存在多个客户端控制器的需求,客户端可以配置派生于 AutoCSer.Net.CommandClientSocketEvent 类型的对象,通过重写 ControllerCreatorParameters 属性配置客户端控制器类型信息,然后手动增加相关客户端控制器属性定义 public IXXX XXX { get; private set; } ,就可以实现 OnMethodVerified 默认操作中自动绑定客户端控制器。

参考示例 AutoCSer2\Example2\CommandServer\Client\CommandClientSocketEvent.cs