【发布时间】: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