跳到主要内容
版本:1.3.9

创建TouchRpc服务器

一、说明

TouchRpc的服务器有多种形式的host,每种服务器的创建都大同小异,且功能基本一致。

二、服务器架构

TouchRpc服务器的架构与其所属的基础协议架构一致,例如,在基于tcp协议时,其架构就和tcp服务器一致。在收到新客户端连接时,会创建一个TcpTouchRpcSocketClient的类实例,与客户端TcpTouchRpcClient一一对应,后续的数据通信均由此实例负责。

三、可配置项

可配置项

SetVerifyTimeout

设置验证超时时间,默认3000ms。(仅TcpTouchRpc可用) 。

SetVerifyToken

设置验证口令。

SetHeartbeatFrequency

设置心跳。默认为间隔2000ms,连续3次无响应即视为断开。

SetSerializationSelector

设置序列化选择器。

SetResponseType

设置允许的响应类型

SetRootPath

设置根路径

四、支持插件接口

声明自定义实例类,然后实现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协议

具体步骤

  1. nuget 安装TouchSocket.AspNetCore或者TouchSocketPro.AspNetCore
  2. IServiceCollection添加AddWSTouchRpc,并进行相关配置(不用配置端口,会和asp使用同一端口)。
  3. IApplicationBuilder必须先使用UseWebSockets。
  4. 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();
});
}