套接字在循环中发出会延迟服务器响应

时间:2016-10-15 12:39:42

标签: javascript node.js sockets

我正在查看简单节点js&套接字聊天模型,我做了一点改变 - 当用户创建与服务器的套接字连接时,他发出250,000个消息事件。服务器应该通过向所有其他参与者发送这些消息来响应,并且它可以工作。 问题是,由于某种原因,只有在第一个用户完成发送所有250,000个消息后,其他用户才会收到第一条消息。 想要的结果是用户和服务器的某种并行执行。

我已经使用localhost / 3000和chrome开发者控制台来进行这些测试。 有任何想法吗? 感谢。

server.js:

var PORT = process.env.PORT || 3000;
var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.use(express.static(__dirname + '/public'));

io.on('connection', function (socket){
    console.log('user connected via socket.io');

    socket.on('message', function(message){
        console.log('Message received: ' + message.text);
        socket.broadcast.emit('message', message);
    } );

    socket.emit('message', {
        text: 'welcome to chat app'
    })
} );

http.listen(PORT, function(){
    console.log('server started');
});

app.js:

var socket = io();

socket.on('connect', function (){
    console.log('Connected to sockets.io server');

    for(var i = 0; i <250000; i++){
        socket.emit('message', {
            text: 'welcome to chat app'
        })
    }
} );

socket.on('message', function(message){
    console.log('New message ' + counter);
} );

1 个答案:

答案 0 :(得分:0)

来自MDN

  

JavaScript运行时包含一个消息队列,它是要处理的消息列表。功能与每条消息相关联。当堆栈为空时,将从队列中取出一条消息并进行处理。处理包括调用相关函数(从而创建初始堆栈帧)。当堆栈再次变空时,消息处理结束。

环回接口的传输速度非常快。使用websocket message事件填充node.js消息队列是可能的,甚至在它有机会处理相应的回调并将broadcast.emit事件添加到队列之前。尝试在客户端添加10-100毫秒的延迟来模拟真实的网络。