我正在使用nodejs + websocket模块通过websocket在客户端和服务器之间建立连接。
服务器向客户端发出几次数据:我知道这是一个TCP连接,但是让我删除对此的所有疑问。
“排放”是顺序的吗?如果第一个“发射”是在时间1s完成的,第二个“发射”是在时间2s完成的,那么客户会肯定收到第一个发射,然后第二个发射吗?
如果尚未收到第一个发射,而第二个发射了,会发生什么情况呢?
发出阻塞调用吗?
最佳答案
WebSockets建立在TCP之上。 TCP保证数据包的传送和排序。此外,与TCP不同,WebSockets是基于消息的,这意味着WebSocket消息将作为一条完整的消息接收(TCP正在流式传输,并且从监听器的角度来看,“消息”可能会变得支离 splinter )
在node.js中,从同一上下文(同一函数)一个接一个调用的两个发射将按该顺序传递。但是,如果您的发射处于两个不同的回调中,则您无法始终保证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在1秒后调用了file2的readFile,浏览器仍可能会无序接收它们(例如,如果file1很大并且需要3秒钟来读入,那么file1的发送将在发送file2之后发生) 。
因此,是的,发射/发送将按照在Node.js中被调用的顺序在浏览器中接收,但是由于Node.js的异步事件驱动性质,发射/发送可能不会按照您期望的顺序发生。
Node.js的异步事件驱动性质使Node.js具有出色的效率和性能,但是如果您不习惯这种基于回调的编程类型,则可能会产生令人惊讶的结果。