socketIO握手看起来像这样:
http://localhost:3000/socket.io/?EIO=3&transport=polling&t=M5eHk0h
t
参数是什么?无法找到解释。
答案 0 :(得分:4)
这是来自engine.io-client的timestampParam
。它的值是使用npm包yeast
生成的唯一ID。
这在Socket Constructor Options(下面的文档)下的API文档中引用。 If no value is given to timestampParam
when creating a new instance of a Socket, the parameter name is switched to t
并从yeast()
分配了一个值。您可以在Line 223 of lib/transports/polling.js
timestampParam
(String
):时间戳参数(t
)
为了澄清engine.io-client
在哪里发挥作用,它是socket.io-client
的依赖关系,socket.io
依赖于engine.io
。 socket.io
提供了构建engine.io-client
的实际通信层实现。 engine.io
是t
的客户端部分。
t
?在评论中指出jfriend00时,timestampParam
用于缓存清除。缓存清除是一种阻止浏览器提供缓存资源而不是请求资源的技术。
Socket.io在查询字符串中使用timestamp参数实现缓存清除。如果您为ts
分配值ts
,则时间戳的密钥为t
,如果未分配值,则默认为yeast
。通过在服务器的每次轮询中为此参数分配使用yeast()
创建的唯一值,Socket.io始终能够从服务器检索最新数据并绕过缓存。由于轮询传输在没有缓存清除的情况下无法按预期工作,因此默认情况下启用时间戳,必须明确禁用。
AFAIK,Socket.io服务器不会将时间戳参数用于除缓存清除之外的任何其他内容。
有关yeast()
的更多信息
yeast()
保证专门用于缓存清除的压缩唯一ID。 README为我们提供了有关encode()
如何运作的更详细信息。
Yeast是一个独特的id生成器。它主要用于生成可用于缓存清除的唯一ID。一种常见的做法是使用时间戳,但使用时间戳时有几个缺点。
- 时间戳已经是13个字符长。这对于1个请求可能无关紧要,但如果你制作了数百个请求,这会很快增加带宽和处理时间。
- 它不够独特。如果你之后生成两个邮票,它们将是相同的,因为时间精度限于毫秒。
醇>Yeast通过以下方式解决了这两个问题:
- 使用自定义
.
函数压缩生成的时间戳,该函数返回数字的字符串表示形式。- 在碰撞情况下播种id(当id与前一个id相同时)。
醇>为了保持字符串的唯一性,它将使用
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream fin; double min = 0; double max = 0; int next; double sum = 0; string fileName; cout << "Enter the name of the file you would like to use: " << endl; cin >> fileName; fin.open(fileName.c_str()); if (fin.fail()) { cout << "Input file opening failed." << endl; exit(1); } while (fin >> next) { if (next > max) { max = next; } if (next < min) { min = next; } } cout << "Min: " << min << " Max: " << max; return 0; }
字符将生成的图章与种子分开。