2013-02-27 165 views
0

对不起,首先是误解了标题,但不能使它更好。 所以这里是我的问题: 我正在使用NodeJS和socket.IO。 我得到了一个类似游戏的大厅系统。你创建root,其他人加入等。 我想当房间的主人关闭连接的房间应该删除自己。我是这样做的断开连接之前的NodeJS连接

db.game.findOne({ _id: ObjectId(roomId) }, function(err, item) 
    { 
     if (err || !item || item.started) 
      return; 

     if (item.createdBy == currentUser) 
     { 
      db.game.remove({ _id: ObjectId(roomId) }, function(err, item) { 
       io.sockets.in(roomId).emit('force_interupt'); 
      }); 
     } 

它的工作,但我有问题。如果这个人只是在浏览器上按REFRESH,网络服务器(php,nginx,mongod)首先获取游戏内容 - >显示它,然后由NodeJS删除游戏,因为连接丢失。 任何想法,我可以避免这一点?

回答

0

对房间生命周期的期望是什么?

如果你想在socket.io连接关闭时关闭房间,你已经得到你想要的。

如果您想在http会话过期时关闭房间,您应该将房间挂到会议上,这意味着您需要在http会话数据中保存房间信息,并在会话过期时移除房间。

如果你想关闭房间时socket.io连接关闭,除非连接关闭被重新加载页面或临时网络问题引起的,你可以这样做:

  1. 定义一个“退出”命令。在客户端,在关闭之前发送一个'quit'命令。在服务器端,如果收到“退出”命令,请立即移除该房间。
  2. 如果连接在没有“退出”命令的情况下关闭,请保留一段时间(例如30秒)。如果在房间拆除之前用户重新连接,请保留房间。否则,请删除房间。
+0

发送“退出”命令的最佳方式是什么?我想到onbeforeunload和onunload,但与onbeforeunload我可以得到确认的返回值和onunload我不能停止卸载 – 2013-02-28 14:49:00

+0

我会建议使用'退出'按钮'退出'命令。在我看来,刷新页面与关闭然后重新打开页面没什么两样。所以,如果刷新不能移除房间,关闭页面也不应移除房间。 – Chen 2013-02-28 15:04:57

+0

我想出了如何做到这一点,谢谢 – 2013-02-28 15:08:23