2013-02-27 4 views
0

처음에는 오해 된 제목에 대해 미안하지만 더 나아질 수는 없습니다. 그래서 여기 내 문제가 있습니다 : NodeJS 및 socket.IO 사용하고 있습니다. 게임과 같은 로비 시스템이 있습니다. 당신은 루트를 만들고, 다른 사람들은 합류합니다. 방 소유자가 연결을 닫으면 방이 스스로 삭제해야합니다. 나는 이것을 좋아했다.연결 해제 전에 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'명령을 보내십시오. 서버 측에서 'quit'명령을 받으면 즉시 방을 제거하십시오.
  2. 'quit'명령없이 연결이 닫히면 잠시 동안 (예 : 30 초) 실내를 유지하십시오. 방을 제거하기 전에 사용자가 다시 연결 한 경우 방을 유지하십시오. 그렇지 않으면 방을 꺼냅니다.
+0

"종료"명령을 보내는 가장 좋은 방법은 무엇입니까? onbeforeunload 및 onunload에 대해 생각했지만 onbeforeunload를 사용하면 확인 결과의 반환 값을 얻을 수 있고 언로드를 중지 할 수 없습니다. –

+0

'quit'명령에 'quit'단추를 사용하는 것이 좋습니다. 제 견해로, 페이지를 새로 고치는 것은 페이지를 닫은 다음 다시 여는 것과 아무런 차이가 없습니다. 따라서 새로 고침으로 방이 제거되지 않으면 페이지를 닫으면 방도 제거되어서는 안됩니다. – Chen

+0

나는 어떻게하는지 알아 냈어. 고마워. –