代码之家  ›  专栏  ›  技术社区  ›  Dave

socket.on(“data”)上的数据缓冲区可以安全保留吗?

  •  1
  • Dave  · 技术社区  · 6 年前

    如果我这样做:

    const net = require('net');
    const allData = [];
    const server = net.createServer((socket) => {
        socket.on('data', (data) => {
            allData.push(data); // store data; not a copy of it
        });
    });
    server.listen(8080, '127.0.0.1');
    
    setInterval(() => {
        console.log(allData);
    }, 5000);
    

    我能保证存储在 allData 会一致吗?还是有可能 net 是否为以后的数据重新使用缓冲区?

    使用上面的代码进行测试并发送简单的curl请求意味着它将 被覆盖,但在 documentation 为了支持这一点, code 有点像迷宫。

    我可以依赖这种行为,还是必须复制缓冲区以确保安全?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Dave    6 年前

    正如patrick roberts在评论中指出的,这是安全的最好迹象,来自执行类似操作的node.js示例。在一些狩猎之后,我发现了这个例子 http 而不是 net 但它们是紧密相连的);

    let body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      // at this point, `body` has the entire request body stored in it as a string
    });
    

    来源: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

    这意味着HTTP数据至少在连接的持续时间内是一致的,假设这意味着它是无限一致的,并不需要太多的扩展。