我想用socket.io构建一个小游戏应用,其工作方式如下:
用户加载网站后,我使用generalConnection命名空间创建一个通用的socket。
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 命名空间。 如果用户注销或关闭窗口,它能很好地工作,会在服务器端触发 disconnect 事件,更新 connectedPlayers 数组并将其发送回已连接的玩家。
问题在于: 当用户: 1. 进入网站。 2. 登录游戏。 3. 注销。 4. 不刷新窗口而再次登录(再次触发 app.startGameSocket 函数)。 5. 在所有这些操作之后关闭窗口时,gameConnection 命名空间的 disconnect 事件不会在服务器上触发,列表也没有更新。
Node shell 显示:info - transport end (socket end),但不会触发 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
)};
但是没有结果。