2013-10-03 8 views
6

노드를 배우려고했으며 socket.io로 매시업을 만들기 시작했습니다. 메시지 전송이 시작되었지만 몇 가지 문제가 있습니다.Socket.io 메시지 이벤트가 여러 번 발생합니다.

메시지 이벤트가 여러 번 발생하여받는 사람의 상자에 여러 번 나타나는 단일 메시지가 표시됩니다. 내가 exports.chat 소켓을 라우팅하고 그것이 문제를 일으키는 지 궁금해했다?

문제의 범위를 좁히려면 다음과 같이하십시오. 메시지는 클라이언트의 연결 순서 = 횟수를 실행합니다. 즉, 클라이언트가 두 번째로 연결하면 메시지가 두 번 발동합니다. 세 번 연결하는 클라이언트에 대해 세 번. 여기

는 코드입니다 :

exports.chat = function(io, pseudoArray, req, res){ 
    res.render('chat', {title: 'ChatPanel.'}); 

     var users = 0; 

     io.sockets.on('connection', function (socket) { // First connection 
      users += 1; 
     // reloadUsers(io, users); 

      socket.on('message', function (data) { // Broadcast the message to all 
       if(pseudoSet(socket)) { 
        var transmit = {date : new Date().toISOString(), pseudo : returnPseudo(socket), message : data}; 
        socket.broadcast.emit('message', transmit); 
        console.log("user "+ transmit['pseudo'] +" said \""+data+"\""); 
       } 
      }); 

      socket.set('pseudo', req.session.user, function(){ 
       pseudoArray.push(req.session.user); 
       socket.emit('pseudoStatus', 'ok'); 
       console.log("user " + req.session.user + " connected"); 
      }); 

      socket.on('disconnect', function() { // Disconnection of the client 
       users -= 1; 
      // reloadUsers(); 
       if (pseudoSet(socket)) { 
        var pseudo; 
        socket.get('pseudo', function(err, name) { 
         pseudo = name; 
        }); 
        var index = pseudoArray.indexOf(pseudo); 
        pseudo.slice(index - 1, 1); 
       } 
      }); 
     }); 
}; 
+0

연결 해제 처리기에서 : pseudo.slice가있는 부분은 getter 핸들러 안에 있어야합니다. –

답변

5

socket.io 코드의 전체 부분이 외부로 나가야합니다. 채팅 기능. 소켓 IO는 http/app 서버와 바인딩해야하므로 각 요청 내에서 처리해야합니다.

메시지 횟수가

무엇 본질적으로 일어나고있는 것은, 새로운 요청이 당신이 메시지에 대한 이벤트 핸들러를 등록하는 도착할 때마다입니다이 때문에 그것을 클라이언트의 연결 순서를 = 발사된다 채팅 URL에 액세스 한 횟수만큼 해고됩니다.

io.socket.on('message', function (data) {...}) 
+11

어떻게 수정 되었습니까? – sniper

+0

나는 또한 동일한 문제에 직면하고있다. 누군가이 문제를 어떻게 해결했는지 알 수있다. 'io.sockets.on ('message '') 코드를 변경하면이 코드가 작동하지 않는다. –

1

나는이 잘못된 행동은 당신이 응용 프로그램 별 메시지로 "메시지"내장/예약 이벤트 이름의 소수 중 하나를 사용하기 때문에 생각 . 확인하려면 이벤트 이름을 "message2"또는 다른 것으로 변경하고 문제가 사라지는지 확인하십시오. 최소한 "연결", "연결 끊기"및 "메시지"는 예약되어 있다고 생각합니다. https://github.com/LearnBoost/socket.io/wiki/Exposed-events

1

그래서 같은 문제가있었습니다.

socket.on('disconnect', function() { 
       socket.removeAllListeners('send message'); 
       socket.removeAllListeners('disconnect'); 
       io.removeAllListeners('connection'); 
      }); 

확실하지, 분리에 전화하지 않아도됩니다

하지만 난 그것을 할 -이 솔루션은 socket.on에 대한 모든 청취자를 닫는 것입니다 ('분리') 이벤트는,이 내 코드는 모습입니다 어쨌든.

+0

실제로 문제가 해결되지 않았다. 두 번째 클라이언트가 로그온 할 때 .. 한 클라이언트가 연결을 끊을 때. 여전히 내 문제가 해결되지 않았습니다. / – joe

관련 문제