gpt4 book ai didi

javascript - 断开连接后,Socket.io 未正确触发事件

转载 作者:搜寻专家 更新时间:2023-10-31 23:48:47 28 4
gpt4 key购买 nike

所以我想用 socket.io 构建一个小游戏应用程序,它是这样工作的:

用户加载一个网站,我使用 generalConnection 命名空间创建一个通用套接字

app.generalSocket = io.connect('http://localhost/generalConnection');

我还没有任何特殊事件,但我认为将它与第二个命名空间分开会很好。

当用户登录时我调用一个函数来启动游戏连接(另一个命名空间)并绑定(bind)一些事件到它,我不会一一列举,我认为这并不重要。

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 数组会更新并发送回已连接的玩家。

问题

当用户:

  1. 进入网站。
  2. 登录游戏。
  3. 注销。
  4. 再次登录而不刷新窗口(再次触发 app.startGameSocket 函数)。
  5. 在关闭窗口之后,服务器上不会触发 gameConnection 命名空间断开连接事件,列表也不会更新。

Node shell 会显示类似信息 - 传输端(套接字端)但不会触发断开连接事件。请帮助:)

我试过了

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

关于javascript - 断开连接后,Socket.io 未正确触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22122548/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com