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
通常发送消息没有分块?
是的,在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
好的答案,但可能是夹头之间的tcp插座内的噪音?我应该解决这个冲突吗? – featureoffuture
好的答案。“套接字由操作系统内核管理。”我还想补充一点,它不只是操作系统,它是你的路由器,它是你的服务提供商,它是世界另一端的服务器。 – Keith
'tcp socket'里面的噪声你不能在TCP套接字中听到噪声,这是一个有保证的协议。如果发送者发送'1,2,3,4'接收端,如果它得到所有的字节将收到'1,2,3,4' ... – Keith
数据始终可以chuncked,即使发送端发送无chuncked。但第一个字节将在第一个块中,块应该按照正确的顺序进行等等。在这个意义上,TCP是一个有保证的协议,UDP另一方面需要更多的关注。 – Keith
这意味着'data'事件可能被触发在服务器上几次(对于1个客户端写操作)? – featureoffuture
是的,你将永远需要处理块。 – Keith