resetid.mdx 2.0 KB
Newer Older
若汝棋茗 已提交
1 2
---
id: resetid
若汝棋茗 已提交
3
title: 服务器重置id
若汝棋茗 已提交
4 5 6 7
---

## 一、说明

若汝棋茗 已提交
8
每个客户端在连接时,服务器都会为连接的客户端**新分配**一个唯一的Id。也就是说,在服务器中Id与SocketClient实例就是一一对应的。
若汝棋茗 已提交
9

若汝棋茗 已提交
10
## 二、配置初始Id策略
若汝棋茗 已提交
11

若汝棋茗 已提交
12
默认情况下服务器都会根据**历史连接数量**,为连接的客户端新分配Id。也就是说,第一个连接的,其Id就是1,以此类推。
若汝棋茗 已提交
13

若汝棋茗 已提交
14
当然我们可以自由的定义Id策略,只需要在Config配置中,配置[SetGetDefaultNewId](../docs/createtcpservice.mdx#setgetdefaultnewid),自定义新id来源即可。要求不和现连接的客户端id重复。
若汝棋茗 已提交
15

若汝棋茗 已提交
16
下列示例,就是使用Guid作为初始Id。
若汝棋茗 已提交
17 18

```csharp
若汝棋茗 已提交
19 20
var config = new TouchSocketConfig();
config.SetGetDefaultNewId(()=>Guid.NewGuid().ToString());
若汝棋茗 已提交
21 22
```

若汝棋茗 已提交
23
## 三、创建能代表连接的Id
若汝棋茗 已提交
24

若汝棋茗 已提交
25
上述这种Id规范,是与连接信息没有任何关联的,这也就意味着,这种方式是无法关联SocketClient的。
若汝棋茗 已提交
26

若汝棋茗 已提交
27
但往往,有时候,我们希望,SocketClient的Id,能一定程度的代表一些信息。例如:以客户端的IP和端口,作为唯一id。
若汝棋茗 已提交
28

若汝棋茗 已提交
29
那这时候,**服务器**可以订阅**Connecting**,然后,为新连接的SocketClient,设置与之有关联信息的id。
若汝棋茗 已提交
30 31

```csharp
若汝棋茗 已提交
32
m_service.Connecting = (client, e) => //有客户端正在连接
若汝棋茗 已提交
33
{
若汝棋茗 已提交
34 35
    e.Id = $"{client.IP}:{client.Port}";
};
若汝棋茗 已提交
36 37 38 39 40 41 42 43
```

:::tip 提示

上述行为通过插件实现可能更加优雅。

::: 

若汝棋茗 已提交
44
## 四、即时修改id
若汝棋茗 已提交
45

若汝棋茗 已提交
46
上述修改Id的方式,应该还不足以应对所有情况。有时候我们希望,在该连接完成,且经过某种验证之后再设置新的id,那么我们可以通过**ResetId**的方法,来实现需求。
若汝棋茗 已提交
47 48 49 50

### 4.1 通过Service直接修改

```csharp
若汝棋茗 已提交
51
service.ResetId("oldId","newId");
若汝棋茗 已提交
52 53 54 55
```

### 4.2 通过SocketClient修改
```csharp
若汝棋茗 已提交
56
socketClient.ResetId("newId");
若汝棋茗 已提交
57 58 59 60
```

:::note 备注

若汝棋茗 已提交
61
上述的Id标识,仅仅是服务器(TcpService)和辅助客户端(SocketClient)之间的关联。与客户端(TcpClient)是没有任何关系的。
若汝棋茗 已提交
62 63

:::