【问题标题】:socket.io data seems to be sent multiple times(nodejs and craftyjs)socket.io 数据似乎被多次发送(nodejs 和craftyjs)
【发布时间】:2013-06-11 22:52:30
【问题描述】:

我正在关注this 制作 HTML5 游戏的教程。我想尝试混合节点以使其成为多人游戏。我在服务器上使用 node.js(v0.10.4),在前端使用 crafty.js。

我正在使用 socket.io 发送和接收消息。现在只有我(不是多个客户)。发生的奇怪事情是来自服务器的消息似乎被发送了多次。我在 socket.io 中打开了调试模式,但它似乎只发送了一次数据,但在前端,数据似乎是多个进来的。我在数据上设置了一个增量器,似乎增量器没有多次增量,而是我得到了相同数据的多个副本。

这里是节点代码:

var http = require('http').createServer(handler),
static = require('node-static'),
io = require('socket.io').listen(http);

io.set('log level', 3);
http.listen(80);
//attach the socket to our server
var file = new static.Server(); //Create a file object so we can server the files in the correct folder

function handler(req, res) {
    req.addListener('end', function() {
      file.serve(req, res);
    }).resume();
}

io.sockets.on('connection', function (socket) { //listen for any sockets that will come from the client 
  socket.on('collected', function(data) {
   /**** here's where the data is being sent back to the client *****/
   socket.emit('messageFromServer', { data: data.number });
  });
});

这是前端代码:

//messenger entity
Crafty.c('SendRecieveMessages',{
    count: 0,
    sendMessageToServer : function() {
      console.log('got a village');
      /**** Here's where we send the message to the server ****/
      socket.emit('collected', { village : "The message went to the server and back. it's collected", number : this.count });
      this.count++;
},
recieveMessageFromServer : function() {
    socket.on('messageFromServer', function(data) {
        /*** This data seems to be coming back or logging multiple times? ***/  
        console.log(data);
    });
}
});

最后,这是调试过程中的屏幕截图。正如您所看到的,数字并不总是在递增,它看起来就像是数据正在被存储。谢谢!

http://cl.ly/image/0i3H0q2P1X0S

【问题讨论】:

  • 你只是在这里定义函数你在哪里使用它们。

标签: node.js socket.io craftyjs


【解决方案1】:

看起来每次你打电话给Crafty.crecieveMessageFromServer() 也会被调用。每次调用recieveMessageFromServer 时,它都会在套接字上附加一个额外的事件侦听器。这就是为什么第一次返回数据时您会获得一份副本,然后第二次获得两个副本,第三次获得三个副本,以此类推。

您要么需要防止recieveMessageFromServer 被多次调用,要么使用removeListenerremoveAllListeners 删除之前附加的监听器。

【讨论】:

    【解决方案2】:

    感谢@Bret Copeland 帮助我解决这个问题。正如他所指出的,每次调用 socket.on() 时,似乎都会添加另一个侦听器。为了防止这种情况...

    我声明了一个全局变量:

    我在我的游戏对象中声明了一个变量作为属性(在craftyjs中,所以在你的设置中使用你想要的任何东西)

    Game = {
    
        //lots of other code here...
    
        //need this to use later for socket.io
        send_message : true
    }
    

    然后编辑我的 recieveMessageFromServer() 函数来检查它是否可以发送消息:

    recieveMessageFromServer : function() {
            console.log('does this show up multiple times?');
            /* Check whether the send_message is true before sending */
            if (Game.send_message) {
                socket.on('messageFromServer', function(data) {
                console.log(data);
                Game.send_message = false;
            });
        }
    }
    

    【讨论】:

    • 一般来说,“全局变量”这个词应该会让你跑上坡路。无需使用标志,只需在 recieveMessageFromServer 函数之外的某处声明事件侦听器即可。这样就不会尝试附加重复的侦听器。
    • 是的,先生!谢谢你,先生! ;)
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2018-04-26
    • 2012-01-11
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多