我正在使用nodejs + websocket模块通过websocket在客户端和服务器之间建立连接。 服务器向客户端发送了几次数据:我知道这是一个TCP连接,但让我删除对它的每一个疑问。 “发出”顺序吗?如果第一次“发射”在时间1s完成,第二次“发射”在时间2s完成,客户端肯定会收到第一次发射然后第二次发射吗? 如果尚未收到第一个发射而第二个发射,会发生什么? 是否会发出阻止呼叫?
答案 0 :(得分:21)
WebSockets基于TCP构建。 TCP保证数据包的传送和排序。此外,与TCP不同,WebSockets是基于消息的,这意味着WebSocket消息作为整个消息被接收(TCP是流式传输,而'消息'可能从监听者的角度来看是碎片化的)
在node.js中,将按顺序传递从相同上下文(相同函数)调用的两个emits。但是,如果你的发射是在两个不同的回调中,你不能总是保证Node.js何时会安排那些回调,因此可能会重新排序发射,因为计划的回调被重新排序。
<强>更新强>
这是一个扩展为什么Node.js的事件驱动性质可能导致令人惊讶的WebSocket发送/发送重新排序的示例:
fs.readFile(file1,function(e,data) { ws.send(data); });
fs.readFile(file2,function(e,data) { ws.send(data); });
file1和file2将被传递到浏览器的顺序是不可预测的(即使文件大小也不能保证它们何时会因缓存,文件系统碎片等问题而触发)。即使稍后使用setTimeout调用file2的readFile,浏览器仍可能无序接收它们(例如,如果file1更大并且需要3s才能读入,那么file1的发送将在send2发送之后发生)
所以是的,发送/发送将按照它们在Node.js中调用的顺序在浏览器中接收,但是由于Node.js的异步事件驱动特性,发出/发送可能不会按照您期望的顺序发生
Node.js的异步事件驱动特性使Node.js具有出色的效率和性能,但如果您不习惯这种类型的基于回调的编程,它可能会产生一些令人惊讶的结果。
答案 1 :(得分:4)
邮件以正确的顺序进入客户端。