我的 node.js 应用程序使用 TCP 和 Socket.io 连接。它将数据从 TCP 转发到相关的 socket.io 连接。
我注意到的是,在通过 WebSockets (socket.io) 发送数据时有一个小的延迟,在最小的有效负载期间并不那么重要,但随着有效负载数量的增加,延迟变得很重要。
这是一个已知的问题?socket.io 上的单个发布大约需要 1.5 秒。
这是我的代码。
var net = require('net');
var httpServer = http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8080);
console.log('Server running at http://127.0.0.1:1337/');
// The Socket.io jibber-jabber
var io = require('socket.io').listen(httpServer);
io.sockets.on('connection', function (socket) {
socket.emit('con',"Connected!");
socket.on('subscribe', function(data) { socket.join(data.room); });
socket.on('unsubscribe', function(data) { socket.leave(data.room); });
webSockets.push(socket);
console.log("Websocket connected.");
socket.on('disconnect', function () {
var index = webSockets.indexOf(socket);
webSockets = webSockets.splice(index,1);
console.log("Websocket disconnected.");
});
});
function SendToSocket(room, mssg)
{
console.log("--- Sending too rooms ---");
var time1 = new Date();
io.sockets.in(room).emit(room, mssg);
var time2 = new Date();
console.log(time1.getSeconds(),time1.getMilliseconds(),"---",time2.getSeconds(),time2.getMilliseconds());
}
var shortServer = net.createServer(function(c) { //'connection' listener
console.log('TCP client connected');
c.on('end', function() {
console.log('TCP client disconnected');
c.destroy();
});
c.on('data', function(data){
console.log(data);
SendToSocket('domain',data);
});
});
shortServer.listen(2501, function() { //'listening' listener
console.log('TCP Server bound');
});
输出如下
info - socket.io started
TCP Server bound
TCP client connected
<Buffer ff fb 1f ff fb 20 ff fb 18 ff fb 27 ff fd 01 ff fb 03 ff fd 03>
--- Sending too rooms ---
42 564 '---' 44 245
42 567 分别表示 socket.io 操作之前的秒和微秒,而 44 245 表示操作之后的时间。延迟接近 2 秒。
只要任何 TCP 连接上有数据,就会调用该sendToSocket
函数。我已经对这个功能进行了计时,它需要接近 1.5 秒才能完成。如果我不使用房间也是一样的,并使用一个简单的 for 循环将数据发送到所有套接字连接。
更多详细信息:来自 TCP 的最大消息有效负载 - 50 字节。在 socket.io 上发送的最大消息负载 - 256 字节或字符。频率 - 高达每秒 3 次。数量:连接数 - 最多 10 个。
PS:在测试过程中,我注意到,即使我只从一个没有 Socket.io 连接的 TCP 连接发送了一条空白消息;socket.io 在调用期间持有应用程序 1.5 秒SendToSocket