Node.js套接字写入顺序

4
当编写Node.js代理服务器时,我注意到数据可能在数据被写入另一个套接字端之前多次进入我的代理。每次收到数据时,我都会调用socket.write();... 但是由于发送的异步性质,我不确定数据传输的顺序是否由Node.js保证与我安排的写入顺序相同。有人知道在这种情况下Node.js的行为吗?如果顺序不能保证,则必须缓冲数据,直到我收到成功发送回调。
1个回答

5
Node.js 是单线程的,一次只能做一件事情。它有一个回调函数队列,按顺序进行处理。 更多信息可以在这里找到:http://howtonode.org/understanding-process-next-tick
只要在收到数据时调用 socket.write,那么它就会按顺序到达。如果你想一下,如果它没有这样做,那么 Node.js 就不能作为一个 Web 服务器使用。例如,一个简单的 Node.js express 网站可能会使用 fs.readfile 来异步地从磁盘上读取一个文件,并使用 socket.write 将其返回给浏览器。如果不保证顺序,那么该文件可能无法正确返回。
来自 Node.js 0.8.14 文档: http://nodemanual.org/latest/nodejs_ref_guide/net.html#net.Socket.write 返回 true 表示整个数据已成功刷新到内核缓冲区。如果所有或部分数据在用户内存中排队,则返回 false。当缓冲区再次空闲时,将发出“drain”事件。
另外,

net.Socket 具有 socket.write() 总是可用的特性。这是为了帮助用户快速启动。计算机并不能始终跟上写入套接字的数据量 - 网络连接可能太慢了。Node.js 将内部队列中写入套接字的数据,并在可能的时候通过线路发送出去。(在内部,它在套接字文件描述符上轮询可写性)


我知道按顺序执行是有道理的,但我听别人说过这并不保证。我猜最重要的是socket.write是否使用队列来存储在发生之前缓冲的写入。也许有人知道吗? - Andrew Chambers
有可能其他人指的是其他流实现,而不是特定的套接字吗?你有链接或参考资料吗? - AndyD
此外,TCP 将确保数据包按顺序传递。一旦数据包进入网络,它们可能不会按顺序到达(从技术上讲),但 TCP 将确保客户端代码按正确顺序接收它们。 - jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接