创建TouchRpc服务器
一、说明
TouchRpc的服务器有多种形式的host,每种服务器的创建都大同小异,且功能基本一致。
二、服务器架构
TouchRpc服务器的架构与其所属的基础协议架构一致,例如,在基于tcp协议时,其架构就和tcp服务器一致。在收到新客户端连接时,会创建一个TcpTouchRpcSocketClient的类实例,与客户端TcpTouchRpcClient一一对应,后续的数据通信均由此实例负责。
三、可配置项
可配置项
四、支持插件接口
声明自定义实例类,然后实现ITouchRpcPlugin接口,即可实现下列事务的触发。 或者继承自TouchRpcPluginBase类,重写相应方法即可。
插件方法 | 功能 |
---|---|
OnHandshaking | 客户端在验证连接。默认情况下,框架会首先验证连接Token是否正确,如果不正确则直接拒绝。不会有任何投递。用户也可以使用Metadata进行动态验证。 |
OnHandshaked | 客户端完成连接验证 |
OnFileTransfering | 在文件传输即将进行时触发。 |
OnFileTransfered | 当文件传输结束之后。并不意味着完成传输,请通过e.Result属性值进行判断。 |
OnLoadingStream | 在远程请求加载流时触发。 |
OnReceivedProtocolData | 收到协议数据 |
OnRemoteAccessing | 在远程操作访问之前。 |
OnRemoteAccessed | 在远程操作访问之后。 |
OnRouting | 当需要转发路由包时。一般所有的客户端之间的数据传输,都需要经过该函数的运行。 |
OnStreamTransfering | 即将接收流数据,用户需要在此事件中对e.Bucket初始化。 |
OnStreamTransfered | 流数据处理,用户需要在此事件中对e.Bucket手动释放。 当流数据传输结束之后。并不意味着完成传输,请通过e.Result属性值进行判断。 |
五、创建服务器
5.1 基于Tcp协议
这是基于Tcp协议TouchRpc。在可配置TouchRpc的基础之上,还可以配置与TcpService可配置项相关的配置。
var service = new TcpTouchRpcService();
var config = new TouchSocketConfig()//配置
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
a.AddFileLogger();
})
.SetVerifyToken("TouchRpc");//设定连接口令,作用类似账号密码
service.Setup(config)
.Start();
service.Logger.Info($"{service.GetType().Name}已启动");
5.2 基于Http协议
这是基于Http升级协议。在该解析器中,配置设置HttpService一致。
var service = new HttpTouchRpcService();
TouchSocketConfig config = new TouchSocketConfig()//配置
.SetListenIPHosts(new IPHost[] { new IPHost(7789) })
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
a.AddFileLogger();
})
.SetVerifyToken("TouchRpc");
service.Setup(config)
.Start();
service.Logger.Info($"{service.GetType().Name}已启动");
5.3 基于Udp协议
这是基于UDP协议解析器。在该解析器中,配置设置与UdpSession一致。因为udp是无连接的,所以不需要SetVerifyToken。
var service = new UdpTouchRpc();
TouchSocketConfig config = new TouchSocketConfig()//配置
.SetBindIPHost(new IPHost(7789))
.ConfigureContainer(a =>
{
a.AddConsoleLogger();
a.AddFileLogger();
});
service.Setup(config)
.Start();
service.Logger.Info($"{service.GetType().Name}已启动");
5.4 基于AspNetCore的Websocket协议
具体步骤
- nuget 安装
TouchSocket.AspNetCore
或者TouchSocketPro.AspNetCore
。 - IServiceCollection添加AddWSTouchRpc,并进行相关配置(不用配置端口,会和asp使用同一端口)。
- IApplicationBuilder必须先使用UseWebSockets。
- IApplicationBuilder调用UseWSTouchRpc,并传入url设置。
在ConfigureServices时,添加AddWSTouchRpc,并且配置相关项。
public void ConfigureServices(IServiceCollection services)
{
//向Asp服务中添加IWSTouchRpcService
services.AddWSTouchRpc(new TouchSocketConfig()
.UseAspNetCoreContainer(services));//设置IOC容器
services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "API Demo", Version = "v1" });
});
}
启用中间件
首先必须启用WebSocket。其次使用UseWSTouchRpc即可。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// Swagger
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "API Demo v1");
});
app.UseWebSockets();//必须先使用WebSocket
app.UseWSTouchRpc("/wstouchrpc");//该操作不会影响原有的WebSocket,只要url不同即可。
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}