2013-05-28 2 views
8

간단한 채팅 응용 프로그램 here을 socket.io 및 node.js와 함께 사용하려고합니다. node.js 서버를 다시 시작할 때마다 socket.io는 자동으로 다시 연결되며 어떻게 든 서버에 대한 연결을 한 번 더 만듭니다. 즉 클라이언트는 이제 동일한 채팅 메시지를 두 번받습니다. 이 문제를 어떻게 해결할 수 있습니까?socket.io 다시 연결하면 하나만 더 연결됩니다.

답변

13

기본적으로 연결을 끊으면 socket.io가 connect 이벤트를 다시 실행하는 연결이 끊긴 연결을 다시 연결합니다. 다시 연결할 때마다 메시지를 수신 할 이벤트 리스너를 하나 더 추가합니다. 따라서 서버 재시작/연결 손실과 동일한 수의 메시지가 수신됩니다. 당신은 처음에 귀를 기울여야

Incoming Chat: 
Connected 
dsdadsada 
Disconnected       //recieved by 1st listener 
Connected       //added 2nd listener 
adasd 
Disconnected       //recieved by 1st listener 
Disconnected       //recieved by 2nd listener 
Connected       //added 3rd listener 

는 이벤트 핸들러를 처음 실행되는 대신 ononce를 사용하여 연결합니다.

iosocket.on('connect', function() { 
     $('#incomingChatMessages').append($('<li>Connected</li>')); 
}); 

iosocket.on('message', function(message) { 
     $('#incomingChatMessages').append($('<li></li>').text(message)); 
}); 

iosocket.on('disconnect', function() { 
     $('#incomingChatMessages').append('<li>Disconnected</li>'); 
}); 
이 그것은 다른 두 이벤트 리스너에 의해 발생할 수 있습니다

가 등록되었습니다 대신이 방법으로 index.html을를 작성

iosocket.once('connect', function() { 

대신

iosocket.on('connect', function() { 
+0

이상적으로는 연결시 이벤트 리스너 (또는 다른 응용 프로그램 기능)를 추가하면 안됩니다. – Shamps

+0

서버 측에서는 네임 스페이스를 사용하여 수정할 수 있습니다. 이렇게하면 서버에서 클라이언트의 발가락'connect' 이벤트에'once'를 사용할 수 있습니다. 슬프게도 우리는 서버에 직접'once'를 쓰지 않습니다 :'io.once ('connect', (socket : SocketIO.Socket) => {})'TS에서 컴파일 에러를 주었고'io.of ('/xyz').once('connect', (socket : SocketIO.Socket) => {})'는 잘 작동합니다. – Lion

5

시도를보십시오 connect 이벤트. 클라이언트 연결이 끊어지면 다른 2 명의 리스너가 계속 여기에 있으며 등록이 해제되지 않습니다.

+1

귀하의 솔루션이 더 좋은 솔루션이라고 생각합니다. 여기서 중요한 것은 클라이언트 스크립트에 '연결'이벤트의 다른 이벤트가 있었음을 의미합니다. (연결 이벤트 바깥쪽에) –

관련 문제