nodejs套接字写入顺序

时间:2012-12-13 07:54:32

标签: node.js sockets

在编写nodejs代理服务器时,我注意到在将数据写入另一个套接字端之前,数据可能会多次进入我的代理。每次我的数据进来时,我都会调用socket.write(); ...

但由于发送的异步性质,我不确定nodejs保证传输的数据的顺序是否与我调度写入的顺序相同。

有没有人知道这种情况下nodejs的行为?

如果订单无法保证,那么我将不得不缓冲数据,直到我收到数据成功发送回调。

1 个答案:

答案 0 :(得分:5)

Node.js是单线程的,一次只能做一件事。它有一个回调队列,按顺序处理。 可以在此处找到更多信息:http://howtonode.org/understanding-process-next-tick

只要您在接收数据时调用socket.write,它就会按顺序到达。如果您考虑一下,如果它没有这样做,那么节点就不能用作网络服务器。例如,一个简单的节点表达站点可能使用fs.readfile异步读取光盘中的文件,并使用socket.write将其提供给浏览器。如果订单无法保证,则可能无法正确返回该文件。

从节点0.8.14文档: http://nodemanual.org/latest/nodejs_ref_guide/net.html#net.Socket.write

  

如果将整个数据成功刷新到内核,则返回true   缓冲。如果全部或部分数据在用户中排队,则返回false   记忆。当缓冲区再次释放时,会发出'drain'。

  

net.Socket具有socket.write()始终有效的属性。这是   帮助用户快速启动和运行。电脑不能总是   跟上写入套接字的数据量   网络连接可能太慢了。 Node.js将在内部   将写入套接字的数据排队并通过网络发送出去   只要有可能。 (在内部,它在套接字的文件上进行轮询   可写的描述符。)