【发布时间】:2014-04-03 01:43:23
【问题描述】:
所以我想用 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 数组被更新并发送回连接的玩家。
问题
当用户:
- 进入网站。
- 登录游戏。
- 退出。
- 不刷新窗口再次登录(再次触发app.startGameSocket函数)。
- 在关闭窗口之后,游戏连接命名空间断开事件不会在服务器上触发,列表也不会更新。
Node shell 表示类似:info - 传输端(套接字端)但不触发断开连接事件。请帮忙:)
我试过
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.disconnect();到 window.onbeforeunload 事件。所以当窗口关闭时连接被终止,但我很想了解什么是错的
标签: javascript node.js sockets websocket socket.io