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

## 一、说明

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

## 二、配置初始ID策略

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

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

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

```csharp
.SetGetDefaultNewID(()=> { return new Guid().ToString(); })
```

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

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

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

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

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

:::tip 提示

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

::: 

## 四、即时修改ID

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

### 4.1 通过Service直接修改

```csharp
service.ResetID("oldId","newId");
```

### 4.2 通过SocketClient修改
```csharp
socketClient.ResetID("newId");
```

:::note 备注

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

:::  