0

クライアントからの状態とブロードキャストイベントの変更を処理するために、複数のクライアントとnode.jsサーバーを使用してリアルタイムWebアプリケーションを構築しています。クライアントとサーバー間の転送メカニズムとしてSocket.ioを実装しました。クライアントが特定のアクションを実行すると、イベントがサーバーに送信され、ネットワーク上の他のクライアントにブロードキャストされます。

ただし、サーバーが一連のイベントを受信する、サーバーはそれをブロードキャストせず、代わりに送信側クライアントに送り返すか、送信側クライアントを含むすべての接続されたソケットに送信する場合があります。

これは、基本的にクライアントイベントをリッスンし、2秒ごとにブロードキャストされる配列にそれらを収集するサーバー実装のスニペットです。

必要に応じて、クライアント実装からの関連するスニペットを含めることができます。

// Require HTTP module (to start server) and Socket.IO
var http = require('http'), io = require('socket.io'), users = require('./users');

// Commands to client
var USER_LOGIN = 0,
    USER_LIST = 1,
    USER_CONNECTED = 2,
    USER_DISCONNECTED = 3,
    COMMAND = 4,
    COMMAND_SETNICKNAME = 0,
    COMMAND_POSITION = 1,
    COMMAND_MOUSEDOWN = 2,

var array = [];
var activeUsers = {};


// Start the server at port 8080
var server = http.createServer(function(req, res){ 
    res.writeHead(200,{ 'Content-Type': 'text/html' }); 
});
server.listen(8080);

// Create a Socket.IO instance, passing it our server
var io = io.listen(server);

// Add a connect listener
io.sockets.on('connection', function(client){ 
    console.log("started");


    // Create periodical which ends a JSON message to the client every 2 seconds
    var interval = setInterval(function() {
        if(array.length >0) {
            console.log("Sending to clients " + array);
        //client.send(JSON.stringify(array));
        client.broadcast.send(JSON.stringify(array));
        array = [];
    }
},2000);

// Success!  Now listen to messages to be received
client.on('message',function(event){ 
        console.log("--Reading event " + event);
        var eventArray = JSON.parse(event);
    for(var i = 0; i < eventArray.length; i++) {
        var dataArray = eventArray[i];
        var userId = parseInt(dataArray[0]);
        var position = 1;

        console.log("current element in array " + dataArray);

        switch (parseInt(dataArray[position++])) {
            case USER_LOGIN: 
                // Log in user with USERID. 
                var username = dataArray[position++];
                console.log("Attempting to log in with user " + username);

                // If valid, send USER_LOGIN broadcast to clients
                if(login(username)) {
                    array.push([0, USER_LOGIN, login(username)]);
                }
                break;
4

1 に答える 1

1
io.sockets.on('connection', function(client){ 
    console.log("started");


    // Create periodical which ends a JSON message to the client every 2 seconds
    var interval = setInterval(function() {
        if(array.length >0) {
            console.log("Sending to clients " + array);
        //client.send(JSON.stringify(array));
        client.broadcast.send(JSON.stringify(array));
        array = [];
    }
},2000);

接続ごとに1つのスケジューラーを作成しているため、混乱が生じます。内部に間隔を作成しているon('connection',
ため、一部のクライアントの変更イベントで変更をプッシュするメソッドがあるため、間隔内にクライアントを呼び出すポイントがありません。これがsocket.ioの利点です。間隔を使用する代わりに、このようなクライアント変更イベントから別のリスナーで変更をブロードキャストできます。

client.on('onSomechangeInClient',function(event){ 
  //update array here..
 client.broadcast.send(JSON.stringify(array));
});
于 2012-11-06T03:19:15.633 に答える