2014-8-19再次描述问题。
有时客户端在发送二进制数据时,服务端收到时少了一个字节,这时服务器会等待这个字节,到来之后才调用onMessage。 然而这个字节是在一段时间(20s)没有通信,服务器发送ping消息,客户端回应pong时。和pong一起收到的。 客户端发送的时候是没有问题的。 应该不是WebSocket包的原因。 有没有大神帮忙分析一下。。
###↓↓↓这是之前的描述 使用WebSocket 客户端发送message到服务器端,即使是在本地有时会有很长的延迟(10s左右)才收到
项目使用的websocket包是Worlize/WebSocket-Node 简单调试了一下源码,发现当需要接收的数据包多于一个的时候,第二个数据包会在发送后很久才到达。 (目前我还不清楚数据包是怎样分的,同样的请求数据有时一个包,有时两个包。)
源码里有关buffer的东西太多,有点弄不懂了。。
有没有遇到过同样问题的大神帮忙指点指点
今天把WebSocket包换成了einaros/ws,问题反而更严重了。
在ws/lib/Receiver.js中有一个expectData方法,其功能就是按照长度length保存WebSocket包的data
Receiver.prototype.expectData = function(length, handler) {
if (length == 0) {
handler(null);
return;
}
this.expectBuffer = this.allocateFromPool(length, this.state.fragmentedOperation);
this.expectHandler = handler;
var toRead = length;//需要读取的长度
while (toRead > 0 && this.overflow.length > 0) {
var fromOverflow = this.overflow.pop();//第一个包(一般只有一个,而且fromOverflow.length=toRead,
//但是问题出现的时候fromOverflow.length=toRead-1,也就是少一个字节)
//正常情况下会再循环一次读取下一个字节,可问题是下一个包还没收到 this.overflow.length = 0,所以并没有循环读取,而是直接返回了
if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
var read = Math.min(fromOverflow.length, toRead);
fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
this.expectOffset += read;
toRead -= read;
}
};
为什么第二个包接收到的这么慢呢? 再深层的代码就是nodejs的net.js 和 _stream_readable.js了。
再次求助啊。。谢谢大家了