服务器重置id
定义
命名空间:TouchSocket.Sockets
程序集:TouchSocket.dll
一、说明
每个客户端在连接时,服务器都会为连接的客户端新分配一个唯一的Id
。也就是说,在服务器中Id
与SessionClient
实例就是一一对应的。
二、配置初始Id策略
默认情况下服务器都会根据历史连接数量,为连接的客户端新分配Id
。也就是说,第1个连接的,其Id就是1(表现形式为01-00-00-00
),以此类推。
当然我们可以自由的定义Id
策略,只需要在Config
配置中,配置SetGetDefaultNewId,自定义新Id
来源即可。要求不和现连接的客户端Id
重复。
下列示例,就是使用Guid
作为初始Id
。
var config = new TouchSocketConfig();
config.SetGetDefaultNewId(()=>Guid.NewGuid().ToString());
三、创建能代表连接的Id
上述这种Id
规范,是与连接信息没有任何关联的,这也就意味着,这种方式是无法关联SessionClient
的。
但往往,有时候,我们希望,SessionClient
的Id
,能一定程度的代表一些信息。例如:以客户端的IP和端口,作为唯一id。
那这时候,服务器可以订阅Connecting,然后,为新连接的SessionClient
,设置与之有关联信息的id。
m_service.Connecting = (client, e) => //有客户端正在连接
{
e.Id = $"{client.IP}:{client.Port}";
};
上述行为通过插件实现可能更加优雅。
四、即时修改Id
上述修改Id的方式,应该还不足以应对所有情况。有时候我们希望,在该连接完成,且经过某种验证之后再设置新的Id,那么我们可以通过ResetIdAsync的方法,来实现需求。
4.1 通过Service直接修改
await service.ResetIdAsync("oldId","newId")
4.2 通过SessionClient修改
首先,需要获取到SessionClient
。
一般使用Service
,或者在插件中,都可以获取到SessionClient
。
然后需要判断该SessionClient
是否实现了IIdClient
接口。一般服务器端的终端,都会实现IIdClient
接口。
以TcpService为例:
tcpService.Received = async (client, e) =>
{
if (client is IIdClient idClient)
{
await idClient.ResetIdAsync("newId");
}
};
上述的Id标识,仅仅是服务器(TcpService)和辅助客户端(SessionClient)之间的关联。与客户端(TcpClient)是没有任何关系的。