Node.js tcpsocket事件

问题描述:

我对Node.js tcp socket和on('data')事件有疑问。Node.js tcpsocket事件

例如,我的客户端通过非常长的消息socket.write('<VERY LONG MESSAGE>')向套接字发送数据;

服务器正在侦听端口并接收该数据。

可以通过服务器data接收到的<VERY LONG MESSAGE>事件不是从其起始字节? (例如被分成3部分或更多部分)。

我知道关于合并消息,但是如何分块?

我应该实现收到的数据大小验证和几个data事件结果的合并结果我的套接字或socket.write通常发送消息没有分块?

+1

数据始终可以chuncked,即使发送端发送无chuncked。但第一个字节将在第一个块中,块应该按照正确的顺序进行等等。在这个意义上,TCP是一个有保证的协议,UDP另一方面需要更多的关注。 – Keith

+0

这意味着'data'事件可能被触发在服务器上几次(对于1个客户端写操作)? – featureoffuture

+0

是的,你将永远需要处理块。 – Keith

是的,在write和内部接收有效负载时都可能发生。

套接字由操作系统内核管理。由于网络I/O需要时间,因此它们通常使用两个队列缓冲区用于套接字;一个用于发送,另一个用于接收数据。由于分块的消息大小可能因不同平台而异。

测试自己:

const net = require("net"); 
var server = net.createServer({ 
    allowHalfOpen: false, 
    pauseOnConnect: false 
}, function(serversideSocket) { 
    console.log("socket connected"); 
    serversideSocket.on("data", function(data) { 
     console.log(`got data of size ${data.length}`); 
    }); 
    serversideSocket.on("end", function() { 
     console.log("client disconnected, closing"); 
     server.close(); 
    }); 
}).listen(1337, "127.0.0.1", function() { 
    console.log("server listening"); 
    var clientsideSocket = net.createConnection({ 
     port: 1337, 
     host: "127.0.0.1", 
     allowHalfOpen: false 
    }); 
    var sendBuffer = Buffer.allocUnsafe(1048576); 
    clientsideSocket.write(sendBuffer); 
    clientsideSocket.end(); 
}); 

这里是我的输出:

server listening 
socket connected 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
got data of size 65536 
client disconnected, closing 
+0

好的答案,但可能是夹头之间的tcp插座内的噪音?我应该解决这个冲突吗? – featureoffuture

+0

好的答案。“套接字由操作系统内核管理。”我还想补充一点,它不只是操作系统,它是你的路由器,它是你的服务提供商,它是世界另一端的服务器。 – Keith

+0

'tcp socket'里面的噪声你不能在TCP套接字中听到噪声,这是一个有保证的协议。如果发送者发送'1,2,3,4'接收端,如果它得到所有的字节将收到'1,2,3,4' ... – Keith