4

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

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

有谁知道 nodejs 在这种情况下的行为?

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

4

1 回答 1

5

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

只要您在接收数据时调用socket.write,它就会按顺序到达。如果您考虑一下,如果它不这样做,那么节点将无法用作网络服务器。例如,一个简单的 node express 站点可能使用 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 将在内部对写入套接字的数据进行排队,并尽可能通过线路将其发送出去。(在内部,它轮询套接字的文件描述符是否可写。)

于 2012-12-13T10:50:03.310 回答