为什么socket.io会为事件

时间:2015-12-05 14:13:00

标签: javascript angularjs node.js sockets socket.io

我刚刚开始接收socket.io。我试图在angular.js中使用它,一切正常。但是,它会多次返回

在我的controller.js

socketio.emit('GameOver',$scope.currentPlayer.Name);
      socketio.on('GameOverEmit',function(data){
        if(data === $rootScope.user.user_name){
          var result = {
            opponent : rdyplayers.user_name,
            result : "won"
          };
            // keep getting multiple result 
          console.log(result);
        }else{
          var result = {
            opponent : rdyplayers.user_name,
            result : "lose"
          };
            // keep getting multiple result 
          console.log(result);
        }
      });

在我的server.js

io.sockets.on('connection', function (client) {
​
           client.user_name = user.user_name;
​
          //Useful to know when someone connects
           console.log('\t socket.io:: player ' + client.user_name + ' connected');
           // playerturn
            client.on('PlayerTurn',function(data){
                 io.emit('PlayerTurnEmit',data);
​
            });
            // game over
            client.on('GameOver',function(data){
                 io.emit('GameOverEmit',data);
​
            });
            // button disabled
            client.on('PlayerButtonDisabled',function(data){
                io.emit('PlayerButtonDisabledEmit',data);
            });
               //When this client disconnects
           client.on('disconnect', function () {
                   //Useful to know when someone disconnects
               console.log('\t socket.io:: client disconnected ' + client.user_name );
               io.emit("disconnected",client.user_name);
           }); //client.on disconnect
​
       }); //io.sockets.on connection

我是否以正确的方式使用socket.io?为了向所有人广播数据,我只需将数据传递到emit并使用on将数据广播,例如将数据传递给服务器并将其传递回前端? / p>

2 个答案:

答案 0 :(得分:2)

广播使用socket.broadcast.emit()

我在客户端代码中找不到任何套接字断开侦听事件代码。尝试添加socketio.disconnect以断开客户端的连接

并且还通过添加socketio.on('disconnect', function(){do something})

在客户端添加一个侦听器,用于从服务器到客户端的套接字断开发出事件

答案 1 :(得分:2)

它是由controller.js引起的,每当我重新访问页面时它都会建立一个新的套接字,所以我所做的就是当用户离开或关闭标签时它会删除所有的监听器。 我最终通过在我的service.js中添加了getsocket来解决它。

ttt.factory('socketio', ['$rootScope', function ($rootScope) {
  'use strict';

  var socket = io.connect();
  return {
      on: function (eventName, callback) {
          socket.on(eventName, function () {
              var args = arguments;
              $rootScope.$apply(function () {
                  callback.apply(socket, args);
              });
          });
      },
      emit: function (eventName, data, callback) {
          socket.emit(eventName, data, function () {
              var args = arguments;
              $rootScope.$apply(function () {
                  if (callback) {
                      callback.apply(socket, args);
                  }
              });
          });
      },
      getSocket: function() {
        return socket;
      }

  };
}]);

在我的controller.js中我做了

$scope.$on('$destroy', function (event) {
  socketio.getSocket().removeAllListeners();
});