为什么一个事件多次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();
});
我刚开始捡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();
});