【问题标题】:Node.js: Race condition when receiving data on tcp socketNode.js:在 tcp 套接字上接收数据时的竞争条件
【发布时间】:2019-11-29 12:35:47
【问题描述】:

我正在使用 Node.js 的网络库连接到发布数据的服务器。所以我在客户端监听“数据”事件。当 data-event 被触发时,我将接收到的数据附加到我的 rx-buffer 并通过读取一些字节来检查我们是否收到了完整的消息。如果我收到一条有效消息,我会从缓冲区中删除该消息并进行处理。源代码如下:

rxBuffer = ''

client.on('data', (data) => {
  rxBuffer += data

  // for example... 10 stores the message length...
  while (rxBuffer.length > 10 && rxBuffer.length >= (10 + rxBuffer[10])) {
    const msg = rxBuffer.slice(0, 10 + rxBuffer[10])
    rxBuffer = rxBuffer.slice(0, msg.length) // remove message from buffer
    processMsg(msg) // process message..
  }
})

据我所知,典型的方式。但是......如果数据事件多次触发会发生什么?所以,想象一下我得到了一个数据事件,当我将数据附加到我的 rx 缓冲区时,我得到了下一个数据事件。所以“新”数据事件也会将数据附加到 rxBuffer 并启动我的 while 循环。所以我有两个处理相同消息的处理程序,因为它们共享相同的 rx 缓冲区。它是否正确? 我该如何处理?在其他语言中,我会说使用互斥锁之类的东西来防止对 rx-buffer 的多次访问……但是对于 js 的解决方案是什么?!?!或者也许我错了,当一个事件仍然处于活动状态时,我永远不会收到多个数据事件?有什么想法吗?

【问题讨论】:

    标签: node.js sockets tcp buffer


    【解决方案1】:

    JavaScript 是单线程的。在第一个事件完成或阻塞之前,第二个事件不会运行,后者可能会发生在您的processMsg() 中。如果是这种情况,processMsg() 的多次执行可能会被交错。如果他们没有更改任何全局数据(包括rxBuffer),那么您应该没有问题。

    【讨论】:

      猜你喜欢
      • 2017-10-11
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 2012-12-28
      相关资源
      最近更新 更多