0

node.js と socket.io をいじって、カウント プログラムを動作させようとしています。基本的には、接続されたクライアントがボタンを押すたびに共有カウンターを 1 増やし、その数を接続されているすべてのクライアントに表示する必要があります。

私が得ているのは、各クライアントが何らかの形で個別のカウンターを持っているということです。たとえば、あるクライアントで 10 まで数えた後、別のクライアントでカウントを開始すると、最初のクライアントは 10 から再開されます。私はできる限りこれをトラブルシューティングしようとしましたが、JS スコープの問題 (これが原因であると思われます) やソケットに関してはあまり詳しくありません。

var socketio = require('socket.io');
var io;
var count = 1;

exports.listen = function(server){
    io = socketio.listen(server);
    io.set('log level', 1);

    io.sockets.on('connection', function (socket){
        joinRoom(socket, 'Lobby');
        count = handleCounter(socket, count);
    });
};

function handleCounter(socket, count){
    socket.on('endCount', function(){
        io.sockets.emit('endCount', {
            success: true,
            num: count
        });
            count++;
            console.log(count);
    });
    return count;
}

function joinRoom(socket, room){
    socket.join(room);
}

注意として、以前は handleCounter からコードをio.sockets.on('connection')関数に配置しただけで機能していましたが、上記のコードのように外部に配置しようとすると機能しない理由を知りたいです。

どんな助けでも本当に感謝しています、ありがとう。

4

2 に答える 2

3

countの最後に戻ってhandleCounter()いますが、非同期関数でインクリメントされているため、戻る前にインクリメントされていません。

渡す代わりに、ファイルの先頭で宣言しcountた変数を参照するだけでcount済みます。これは、すべてのクロージャーで使用できます。endCountクライアントが接続するたびに新しいカウントをクライアントに送信するだけであれば、リスナーとエミッターも必要ありません。

var socketio = require('socket.io');
var io;
var count = 1;

exports.listen = function(server){
    io = socketio.listen(server);
    io.set('log level', 1);

    io.sockets.on('connection', function (socket){
        joinRoom(socket, 'Lobby');
        handleCounter();
    });
};

function handleCounter(){
    count++;
    console.log(count);

    io.sockets.emit('count', {
        success: true,
        num: count
    });
}

function joinRoom(socket, room){
    socket.join(room);
}
于 2013-04-14T01:14:20.473 に答える
0

http://realtimeanswer-5042.usw1.actionbox.io:4000/

つまり、接続時にデータを送信し、ボタンのクリック時にすべてのクライアントにデータを送信します。

クライアントは、サーバーからメッセージを受け取ったときにのみ dom を更新します。

あなたのコードに見られる最大の問題は、count の範囲が複雑になっていることです。これはモジュールスコープであり、渡すことなく簡単に使用できます。

サーバ:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server)
  , count = 0;

var port = 4000;

server.listen(port);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.set('log level', 1);

io.sockets.on('connection', function (socket) {
  console.log(count);
  socket.emit('count', count);
  socket.on('inc', function () {
    count++;
    console.log('inc', count);
    io.sockets.emit('count', count);
  });
});

クライアント

<!DOCTYPE html>
<meta charset='utf-8'>
<title>real time fun</title>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery.js"></script>

<script>
  $(function() {
    var socket = io.connect();

    socket.on('count', function (count) {
      $('#count').text(count);
    });

    $('button').click(function () {
      socket.emit('inc');
    });
  });
</script>
<div id='count'></div>
<button>inc</button>
于 2013-04-14T01:10:05.437 に答える