我对Node.js tcp socket和on(' data')事件有疑问。
例如,我的客户端使用非常长的消息socket.write('<VERY LONG MESSAGE>')
;
服务器正在侦听端口并接收该数据。
是否可以从服务器<VERY LONG MESSAGE>
事件收到data
而不是从其起始字节开始? (例如,被3个或更多部分分块)。
我知道合并消息但是关于分块呢?
我是否应该实现收到的数据大小验证并合并我的套接字的少量data
事件结果,或socket.write
通常在没有分块的情况下发送消息?
答案 0 :(得分:1)
是的,在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