高性能的 TCP 服务框架是 AutoCSer 的核心组件,需要引用 AutoCSer\Packet\*\AutoCSer.dll。
我认为 TCP 服务的本质就是远程函数调用,所以 AutoCSer 的 TCP 服务设计是基于函数原型定义的,目标是让远程函数调用和本地函数调用一样简单,并尽可能的保留常用的本地函数特性。
框架根据应用场景分为内部静态服务内部实例服务开放服务
内部服务开放服务的默认配置参数与防御攻击策略不同。
内部服务默认配置:数据缓冲区 64KB,最大发送数据缓冲区 1MB,验证超时 4s,客户端失败重连时间 10ms,批量输出休眠等待时间 0ms,使用二进制序列化,服务端开启线程输出,客户端启动时创建连接,支持服务注册
开放服务默认配置:数据缓冲区 8KB,服务端最大发送数据缓冲区 8KB,验证超时 9s,客户端失败重连时间 1s,批量输出休眠等待时间 1ms,使用 JSON 序列化,服务端同步输出,客户端在第一次访问时创建连接,客户端最大自定义数据包为 16KB
该功能需要在工程项目中配置静态代码生成

内部静态服务

内部静态服务的远程调用函数(只支持 静态函数 / 静态属性 / 静态字段)可以分布在同一个程序集的各个 class 中,用于整合大量零碎的远程调用函数,而无需定义一个单独的服务类型。

1. 在需要支持远程函数调用的 class 定义中添加 partial 修饰符,如果该 class 是一个嵌套类型,需要给所有上级 class 都添加 partial 修饰符,因为静态代码生成需要与它公用同一个类型以访问远程函数。

2. 给 class 添加 TCP 服务申明配置 [AutoCSer.Net.TcpStaticServer.Server(Name = "SERVER")],必须指定所属服务名称,该名称必须符合 C# 类型命名规范,因为静态代码生成需要使用它作为服务类型名称使用。
同一个服务名称的多个 TCP 服务申明配置,有且只能有其中一个绑定为该 TCP 服务配置 IsServer = true,其它申明配置仅用于通知静态代码生成模块该 class 中存在需要静态代码生成处理的远程函数。

3. 给函数添加 TCP 远程函数申明配置 [AutoCSer.Net.TcpStaticServer.Method(ServerName = "SERVER")],为了防止调用者混淆远程函数与本地函数产生误调用,默认配置下远程函数必须对于其它程序集不可见(private / protected / internal)
如果没有指定所属服务名称 ServerName,则默认配置为当前 class 的 TCP 服务申明配置中指定的服务名称。

4. 给该工程项目配置静态代码生成并编译项目,然后将生成的 TCP 代理层代码源文件 {项目名称}.AutoCSer.cs 添加到项目中。

. 支持函数成员选择配置,默认选择其它程序集不可见函数成员,而且必须申明 TCP 远程函数配置 [AutoCSer.Net.TcpStaticServer.Method]

无需 TCP 远程函数申明配置 参考示例 AutoCSer\Example\TcpStaticServer\NoAttribute.cs
公共函数支持 参考示例 AutoCSer\Example\TcpStaticServer\Static.cs

. 支持静态字段与可读静态属性,默认支持取值操作,不支持赋值操作

字段支持 参考示例 AutoCSer\Example\TcpStaticServer\Field.cs
可读属性支持 参考示例 AutoCSer\Example\TcpStaticServer\Property.cs

. 同步函数支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpStaticServer\RefOut.cs

. 同步函数支持客户端异步模式,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpStaticServer\ClientAsynchronous.cs

. 对于没有返回值且可靠性要求不高的需求,同步函数支持仅发送请求模式(无需服务端响应),返回值类型必须为 void,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpStaticServer\SendOnly.cs

. 支持异步回调,返回值类型必须为 void,不支持 ref / out 参数,最后一个参数类型必须是委托 Func<AutoCSer.Net.TcpServer.ReturnValue, bool> 或者 Func<AutoCSer.Net.TcpServer.ReturnValue<returnType>, bool>
服务端必须保证该回调委托被执行,该委托的返回值表示回调数据是否成功添加到发送队列中,失败可能意味着该连接已经关闭。

参考示例 AutoCSer\Example\TcpStaticServer\Asynchronous.cs

. 支持异步回调注册,也就是说客户端一个请求,服务器端可以任意多次回调回应。

参考示例 AutoCSer\Example\TcpStaticServer\KeepCallback.cs

由于 内部静态服务内部实例服务 对于性能影响的区别仅仅在于静态函数与实例函数调用的差别,不存在本质性的差别,所以性能测试项目请参考 内部实例服务

内部实例服务

内部实例服务只支持实例方法,需要定义一个服务类 class ,用于整合少量的远程调用函数,服务的客户端也是一个单独的类型。

1. 在服务类 class 定义中添加 partial 修饰符,如果该 class 是一个嵌套类型,需要给所有上级 class 都添加 partial 修饰符,因为静态代码生成需要与它公用同一个类型以访问远程函数。

2. 给 class 添加 TCP 服务申明配置 [AutoCSer.Net.TcpInternalServer.Server(Host = "127.0.0.1", Port = 12345)]

3. 给实例方法添加 TCP 远程函数申明配置 [AutoCSer.Net.TcpServer.Method],为了防止调用者混淆远程函数与本地函数产生误调用,默认配置下远程函数必须对于其它程序集不可见(private / protected / internal)

4. 给该工程项目配置静态代码生成并编译项目,然后将生成的 TCP 代理层代码源文件 {项目名称}.AutoCSer.cs 添加到项目中。

. 支持函数成员选择配置,默认选择其它程序集不可见函数成员,而且必须申明 TCP 远程函数配置 [AutoCSer.Net.TcpServer.Method]

无需 TCP 远程函数申明配置 参考示例 AutoCSer\Example\TcpInternalServer\NoAttribute.cs
公共函数支持 参考示例 AutoCSer\Example\TcpInternalServer\Static.cs

. 支持静态字段与可读静态属性,默认支持取值操作,不支持赋值操作

字段支持 参考示例 AutoCSer\Example\TcpInternalServer\Field.cs
可读属性支持 参考示例 AutoCSer\Example\TcpInternalServer\Property.cs

. 同步函数支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpInternalServer\RefOut.cs

. 同步函数支持客户端异步模式,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpInternalServer\ClientAsynchronous.cs

. 对于没有返回值且可靠性要求不高的需求,同步函数支持仅发送请求模式(无需服务端响应),返回值类型必须为 void,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpInternalServer\SendOnly.cs

. 支持异步回调,返回值类型必须为 void,不支持 ref / out 参数,最后一个参数类型必须是委托 Func<AutoCSer.Net.TcpServer.ReturnValue, bool> 或者 Func<AutoCSer.Net.TcpServer.ReturnValue<returnType>, bool>
服务端必须保证该回调委托被执行,该委托的返回值表示回调数据是否成功添加到发送队列中,失败可能意味着该连接已经关闭。

参考示例 AutoCSer\Example\TcpInternalServer\Asynchronous.cs

. 支持异步回调注册,也就是说客户端一个请求,服务器端可以任意多次回调回应。

参考示例 AutoCSer\Example\TcpInternalServer\KeepCallback.cs

性能测试项目
AutoCSer\TestCase\TcpServerPerformance\AutoCSer.TestCase.TcpInternalServerPerformance
AutoCSer\TestCase\TcpClientPerformance\AutoCSer.TestCase.TcpInternalClientPerformance

开放服务

开放服务只支持实例方法,需要定义一个服务类 class ,用于整合少量的远程调用函数,服务的客户端也是一个单独的类型。

1. 在服务类 class 定义中添加 partial 修饰符,如果该 class 是一个嵌套类型,需要给所有上级 class 都添加 partial 修饰符,因为静态代码生成需要与它公用同一个类型以访问远程函数。

2. 给 class 添加 TCP 服务申明配置 [AutoCSer.Net.TcpOpenServer.Server(Host = "127.0.0.1", Port = 12345)]

3. 给实例方法添加 TCP 远程函数申明配置 [AutoCSer.Net.TcpOpenServer.Method],为了防止调用者混淆远程函数与本地函数产生误调用,默认配置下远程函数必须对于其它程序集不可见(private / protected / internal)

4. 给该工程项目配置静态代码生成并编译项目,然后将生成的 TCP 代理层代码源文件 {项目名称}.AutoCSer.cs 添加到项目中。

. 支持函数成员选择配置,默认选择其它程序集不可见函数成员,而且必须申明 TCP 远程函数配置 [AutoCSer.Net.TcpServer.Method]

无需 TCP 远程函数申明配置 参考示例 AutoCSer\Example\TcpOpenServer\NoAttribute.cs
公共函数支持 参考示例 AutoCSer\Example\TcpOpenServer\Static.cs

. 支持静态字段与可读静态属性,默认支持取值操作,不支持赋值操作

字段支持 参考示例 AutoCSer\Example\TcpOpenServer\Field.cs
可读属性支持 参考示例 AutoCSer\Example\TcpOpenServer\Property.cs

. 同步函数支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpOpenServer\RefOut.cs

. 同步函数支持客户端异步模式,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpOpenServer\ClientAsynchronous.cs

. 对于没有返回值且可靠性要求不高的需求,同步函数支持仅发送请求模式(无需服务端响应),返回值类型必须为 void,不支持 ref / out 参数。

参考示例 AutoCSer\Example\TcpOpenServer\SendOnly.cs

. 支持异步回调,返回值类型必须为 void,不支持 ref / out 参数,最后一个参数类型必须是委托 Func<AutoCSer.Net.TcpServer.ReturnValue, bool> 或者 Func<AutoCSer.Net.TcpServer.ReturnValue<returnType>, bool>
服务端必须保证该回调委托被执行,该委托的返回值表示回调数据是否成功添加到发送队列中,失败可能意味着该连接已经关闭。

参考示例 AutoCSer\Example\TcpOpenServer\Asynchronous.cs

. 支持异步回调注册,也就是说客户端一个请求,服务器端可以任意多次回调回应。

参考示例 AutoCSer\Example\TcpOpenServer\KeepCallback.cs

性能测试项目
AutoCSer\TestCase\TcpServerPerformance\AutoCSer.TestCase.TcpOpenServerPerformance
AutoCSer\TestCase\TcpClientPerformance\AutoCSer.TestCase.TcpOpenClientPerformance