【发布时间】:2017-05-24 03:13:12
【问题描述】:
您好,我想为每个连接到 websocket 服务器的客户端创建唯一的整数 ID。
逻辑是这样的:
- 当客户端连接到服务器时,它会收到一个 ID,它是 uint16。
- id 必须是唯一的,所以如果它获得一个使用的 ID 现有客户将分配一个新客户。
- 当客户端离开 websocket 服务器时,ID 被回收并被 可供新来的客户使用。
- 任何时候并发客户端都不会超过 1000 个,但新客户端可以随时连接。我的意思是 24/7 的任何时候。
我尝试过的:
let i = Date.now();
i &= 0xFFFF; // i will be the unique id.
通过这种方式连接的客户端将获得一个 16 位整数 id。当它离开服务器时,有一些逻辑可以回收它,也许将它放入缓存数组中。但由于有 65535 种可能性,我可能不需要使用该缓存数组。
我知道websocket连接一旦连接就会自动生成一个socket id,但这超过了20个字节,这不是我想要的。
警告:
此方法基于在任何给定时间只有一个客户端尝试连接到 websocket 服务器的假设(精度为毫秒)。
如果两个或多个客户端尝试同时连接。这行不通。但我想这也取决于 cpu 时钟频率或 websocket 服务器允许新客户端连接的频率。
【问题讨论】:
-
@JaromandaX 我正在 websocket 服务器上生成 id。
-
哦,对不起,我误解了这个问题 - 为什么不将当前 ID 存储在某个地方(db、数组等等,实现取决于您)并检查生成的 ID 是否唯一检查哪些已经在使用 - 首先使用 Math.random 生成 ID
-
@JaromandaX 问题是,如果多个客户端尝试连接并且所有客户端都获得了一个已经被使用的 ID,那么将会有很多
Math.random调用。我不确定可能性,但这可能会发生。而且我不确定是否会有比赛条件。假设如果 A 调用Math.random并获得一个现有 ID 现在 B 启动并要求分配一个 ID,然后 A 收到一个 B 正在使用的新 ID。A 需要再次获得一个新 ID 对吗?如果在它完成之前Math.random呼叫 C 进来并且同样的事情再次发生,A 永远无法获得 ID。 -
您如何看待使用会话 ID?会话 ID 必须是每个服务器-客户端连接的唯一标识符。我有类似的情况,这个解决方案对我有用。我使用Java,但我确定没关系。
-
@dim websocket 协议中的会话 ID 是什么?我只知道套接字连接时会自动为其分配一个base-64编码的值,该值存储在
Sec-WebSocket-Key标头中。解码后为 16 个字节。
标签: javascript websocket uniqueidentifier