2016-10-15 10 views
0

単純なノードjs &ソケットチャットモデルをチェックしていましたが、少し変更を加えました。ユーザーがサーバーとのソケット接続を作成すると、250,000メッセージイベントが発生します。サーバーは他のすべての参加者にそれらのメッセージを送信することによって応答し、動作します。 問題は、何らかの理由で、最初のユーザーが25万のメッセージをすべて送信した後にのみ、他のユーザーが最初のメッセージを取得することです。 希望の結果は、ユーザーとサーバーの両方の何らかの並列実行です。ソケットでループが発生するとサーバーの応答が遅くなる

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); 
}); 

答えて

0

MDNから:

A JavaScriptランタイムは、メッセージのリストには、メッセージキューを含み、処理される。関数は各メッセージに関連付けられます。スタックが空の場合、メッセージがキューから取り出して処理されます。処理は、関連する関数を呼び出すこと(したがって初期スタックフレームを作成すること)からなる。スタックが再び空になると、メッセージ処理は終了します。

ループバックインターフェイスを介した送信は非常に高速です。対応するコールバックを処理してbroadcast.emitイベントをキューに追加する前であっても、websocket messageイベントでnode.jsメッセージキューを満たす可能性があります。実際のネットワークをシミュレートするために、クライアントに10〜100ミリ秒の遅延を加えてみてください。

関連する問題