socket.io握手中的“t =”查询参数是什么

时间:2018-02-05 23:26:01

标签: node.js socket.io long-polling

socketIO握手看起来像这样:

http://localhost:3000/socket.io/?EIO=3&transport=polling&t=M5eHk0h

t参数是什么?无法找到解释。

1 个答案:

答案 0 :(得分:4)

这是来自engine.io-clienttimestampParam。它的值是使用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

的来源中看到此信息
  

Socket constructor() Options

     
      
  • timestampParamString):时间戳参数(t
  •   

为了澄清engine.io-client在哪里发挥作用,它是socket.io-client的依赖关系,socket.io依赖于engine.iosocket.io提供了构建engine.io-client的实际通信层实现。 engine.iot的客户端部分。

为什么socket.io使用t

在评论中指出jfriend00时,timestampParam用于缓存清除。缓存清除是一种阻止浏览器提供缓存资源而不是请求资源的技术。

Socket.io在查询字符串中使用timestamp参数实现缓存清除。如果您为ts分配值ts,则时间戳的密钥为t,如果未分配值,则默认为yeast。通过在服务器的每次轮询中为此参数分配使用yeast()创建的唯一值,Socket.io始终能够从服务器检索最新数据并绕过缓存。由于轮询传输在没有缓存清除的情况下无法按预期工作,因此默认情况下启用时间戳,必须明确禁用。

AFAIK,Socket.io服务器不会将时间戳参数用于除缓存清除之外的任何其他内容。

有关yeast() 的更多信息

yeast()保证专门用于缓存清除的压缩唯一ID。 README为我们提供了有关encode()如何运作的更详细信息。

  

Yeast是一个独特的id生成器。它主要用于生成可用于缓存清除的唯一ID。一种常见的做法是使用时间戳,但使用时间戳时有几个缺点。

     
      
  1. 时间戳已经是13个字符长。这对于1个请求可能无关紧要,但如果你制作了数百个请求,这会很快增加带宽和处理时间。
  2.   
  3. 它不够独特。如果你之后生成两个邮票,它们将是相同的,因为时间精度限于毫秒。
  4.         

    Yeast通过以下方式解决了这两个问题:

         
        
    1. 使用自定义.函数压缩生成的时间戳,该函数返回数字的字符串表示形式。
    2.   
    3. 在碰撞情况下播种id(当id与前一个id相同时)。
    4.         

      为了保持字符串的唯一性,它将使用#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; } 字符将生成的图章与种子分开。