为什么一个事件多次socket.ioreturns

Why socket.io returns multiple times for an event

我刚开始捡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 将数据广播出去,就像将数据传递给服务器并将其传回前端一样?

广播使用socket.broadcast.emit()

我在你的客户端代码中没有找到任何套接字断开监听事件代码。尝试为客户端添加socketio.disconnect断开连接

并且还添加一个侦听器到从服务器到客户端的套接字断开连接发出事件..在客户端通过添加socketio.on('disconnect', function(){do something})

它是由 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();
});