[英]Socket.io not firing events properly after disconnecting
所以我想用socket.io构建一个小游戏应用程序,它的工作原理如下:
用户加载网站,我使用generalConnection命名空间创建一个通用套接字
app.generalSocket = io.connect('http://localhost/generalConnection');
我还没有任何特殊事件,但我认为将它与第二个命名空间分开会很好。
当用户登录时,我调用一个启动游戏连接的函数(另一个命名空间)并将一些事件绑定到它,我不会将它们全部列出,我认为这并不重要。
app.startGameSocket = function() {
app.gameSocket = io.connect('http://localhost/gameConnection'); //game connection
app.gameSocket.on("connect", function() {
console.log("connected to the game socket");
});
}
在服务器端我有类似的东西:
var connectedPlayers = [];
var gameConnection = io.of('/gameConnection').on('connection', function (socket) {
socket.on('disconnect', function () {
//some stuff
});
});
再一次,我认为我不需要列出所有事件,我只会解释它是如何工作的。
它会监听新玩家事件,创建新玩家,将其推送到connectedPlayers数组,然后将其发送给连接到gameConnection命名空间的所有人。
用户列表已更新,每个人都很高兴。 当用户关闭浏览器窗口时,我还可以监听其他事件,例如断开连接并适当更新connectedPlayers数组。
当用户从游戏中注销时,我还必须断开gameConnection命名空间,所以在客户端我做:
app.vent.on('logOut', function() {
app.gameSocket.disconnect();
)};
请注意,我将generalConnection命名空间保持打开状态,我只是断开了gameConnection命名空间。
它运行良好,如果用户注销或关闭窗口,在服务器端触发断开事件,connectedPlayers阵列更新并发送回连接的播放器。
当用户:
Node shell表示类似:info - 传输结束(套接字结束)但不触发disconnect事件。 请帮忙 :)
我试过了
app.vent.on('logOut', function() {
app.gameSocket.emit('forceDisconnect'); //force disconnect on the server side
app.gameSocket.disconnect();
app.gameSocket.removeAllListeners(); //tried to really kill disconnected socket
)};
但没有结果。
您可以配置socket.io以断开窗口卸载时的连接。
请参阅Socket.io wiki中客户端的sync disconnect on unload
选项。 此选项默认为false,因此如果启用它,它应该可以解决您的问题。
app.gameSocket = io.connect('http://localhost/gameConnection', {'sync disconnect on unload':true}); //game connection
Socket.io并不是那么有趣!
在我的应用程序中,每次注销>登录过程都是
app.gameSocket = io.connect('http://localhost/gameConnection'); //game connection
因此多次调用它会导致问题。 我把它改成了这样的东西:
app.firstConnect = true;
app.startGameSocket = function(){
if(app.firstConnect){
app.gameSocket = io.connect('http://localhost/gameConnection'); //game connection
}else{
app.gameSocket.socket.reconnect();
}
}
app.vent.on('logOut', function(){
app.firstConnect = false;
});
我的问题已经消失,但socket.reconnect引入了另一个问题! 你可以在这里阅读它https://github.com/LearnBoost/socket.io/issues/430
socket如何识别连接到它的各种客户端,在连接时通过socket参数 。 然后将所有其他事件分配给io.connection块下的每个套接字客户端作为socket.on 。 每当任何客户端连接或断开连接时, 它自己的套接字事件(socket.on)都会被调用,而socket.io会使用该套接字参数和每个套接字的id来识别它。
样品
io.sockets.on('connection', function(socket //unique client socket as parameter) {
//code block
}
例如:
io.sockets.on('connection', function(socket) {
//connect Me(socket)
socket.on('connect', function() {
console.log('disconnected')
})
//disconnect Me(socket)
socket.on('disconnect', function() {
console.log('disconnected')
})
});
你的代码在做什么
app.vent.on('logOut', function() {
app.gameSocket.emit('forceDisconnect'); //force disconnect on the server side
app.gameSocket.disconnect();
app.gameSocket.removeAllListeners(); //tried to really kill disconnected socket
)};
它不会发出客户端特定套接字的断开事件
app.gameSocket.emit('forceDisconnect'); //force disconnect on the server side
强制断开但断开谁?
你需要这样的东西
app.startGameSocket = function() {
app.gameSocket = io.connect('http://localhost/gameConnection'); //game connection
app.gameSocket.on("connect", function() {
console.log("connected to the game socket");
});
//disconnect
app.gameSocket.on("disconnect", function() {
console.log("disconnected");
//force disconnect/logout code
});
app.gameSocket.on('logOut', function() {
//force disconnect/logout code
app.gameSocket.emit('forceDisconnect'); //force disconnect on the server side
app.gameSocket.disconnect();
app.gameSocket.removeAllListeners(); //tried to really kill disconnected socket
)};
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.