---
id: resetid
title: 服务器重置id
---

### 定义

命名空间：TouchSocket.Sockets <br/>
程序集：[TouchSocket.dll](https://www.nuget.org/packages/TouchSocket)

## 一、说明

每个客户端在连接时，服务器都会为连接的客户端**新分配**一个唯一的Id。也就是说，在服务器中Id与SessionClient实例就是一一对应的。

## 二、配置初始Id策略

默认情况下服务器都会根据**历史连接数量**，为连接的客户端新分配Id。也就是说，第一个连接的，其Id就是1，以此类推。

当然我们可以自由的定义Id策略，只需要在Config配置中，配置[SetGetDefaultNewId](./tcpservice.mdx)，自定义新id来源即可。要求不和现连接的客户端id重复。

下列示例，就是使用Guid作为初始Id。

```csharp showLineNumbers
var config = new TouchSocketConfig();
config.SetGetDefaultNewId(()=>Guid.NewGuid().ToString());
```

## 三、创建能代表连接的Id

上述这种Id规范，是与连接信息没有任何关联的，这也就意味着，这种方式是无法关联SessionClient的。

但往往，有时候，我们希望，SessionClient的Id，能一定程度的代表一些信息。例如：以客户端的IP和端口，作为唯一id。

那这时候，**服务器**可以订阅**Connecting**，然后，为新连接的SessionClient，设置与之有关联信息的id。

```csharp showLineNumbers
m_service.Connecting = (client, e) => //有客户端正在连接
{
    e.Id = $"{client.IP}:{client.Port}";
};
```

:::tip 提示

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

::: 

## 四、即时修改id

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

### 4.1 通过Service直接修改

```csharp showLineNumbers
service.ResetId("oldId","newId");
```

### 4.2 通过SessionClient修改
```csharp showLineNumbers
SessionClient.ResetId("newId");
```

:::note 备注

上述的Id标识，仅仅是服务器（TcpService）和辅助客户端（SessionClient）之间的关联。与客户端（TcpClient）是没有任何关系的。

:::  