【问题标题】:Generating unique ID for client connected to a websocket server为连接到 websocket 服务器的客户端生成唯一 ID
【发布时间】:2017-05-24 03:13:12
【问题描述】:

您好,我想为每个连接到 websocket 服务器的客户端创建唯一的整数 ID。

逻辑是这样的:

  1. 当客户端连接到服务器时,它会收到一个 ID,它是 uint16。
  2. id 必须是唯一的,所以如果它获得一个使用的 ID 现有客户将分配一个新客户。
  3. 当客户端离开 websocket 服务器时,ID 被回收并被 可供新来的客户使用。
  4. 任何时候并发客户端都不会超过 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


【解决方案1】:

放弃使用 uint16 的想法,改用 UUID。 https://en.wikipedia.org/wiki/Universally_unique_identifier

这些算法专为这种确切类型的用例而设计。它们经过充分测试和标准化。

使用此方法,您不必重复使用 ID。这对于记录日志特别方便,因此您始终可以确定特定连接发生了什么。此外,它在服务器之间是独一无二的,因此如果您进行扩展,您不必担心冲突。

https://www.npmjs.com/package/uuid

【讨论】:

  • 但我需要更小的 ID 而不是 128 位 UUID。发送这些 ID 时,我需要减少网络带宽。我不需要这么大的身份证。如果我不关心带宽,我可以使用自动生成的套接字 ID。
  • @newguy 在什么情况下您可能会遇到 HTTP 请求的所有开销,然后切换协议,但不能有额外的几个字节来发送正确生成的身份证一次? HTTP 响应状态行比这个长!
  • ID 不仅在响应中发送,还在连接建立后发送。我正在构建一个以每秒 10 次来回发送更新的 MMO 游戏。 ID 将成为消息的一部分。想想有 500 个连接的客户端,每次更新每个客户端发送 10 个额外字节将导致每秒增加 50k 带宽。这只是最好的情况。
  • @newguy 为什么必须多次发送 ID?建立连接后,您只需将 ID 与该连接关联即可。无需再次发送。
  • 不是当前连接的客户端的ID,而是其他连接的客户端的ID。如果不知道他们的 ID,您将无法知道您周围的人吗?所以实际上在建立连接后会有多个ID发送给客户端,如果我使用128位ID的话,流量会很快变得难以承受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 2018-04-11
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多