2016-09-13 2 views
3

socket.on ('disconnect')이 클라이언트 측에서 즉시 시작되지만 서버 측에서 1 분이 소요됩니다.소켓 io js 연결 끊기 방출

시나리오 1 : 클라이언트가 인터넷 문제로 인해 연결이 끊어지면 서버 측 연결 끊기가 1 분 후에 서버 측에서 즉시 찾을 수 있습니다.

필자는 pingTimeout = 30000 및 pingInterval = 12000을 변경하려고 시도했지만 매 30 초마다 다시 연결하여 연결하려고했습니다.

답변

3

연결 해제 및 다시 연결을 쉽게하기 위해 시간 초과 지연과 소켓 연결 끊김 이벤트를 사용할 수 있습니다.

소켓이 연결되면 버킷 개체에 추가하십시오. 이것은 당신이 추적 할 수 있도록 소켓 ID를 저장하는 객체를 만들기 socketId

//object for delayed log out 
let disconnection = { 
    sid : null, //socket id 
    delay : null //timeout id 
}; 

의 핵심으로 (I 소켓에 닿는 노드 세션을 통해 추적) 플레이어의 ID를 추가

if (socket.request.sessionID && !bucket[socket.request.sessionID]) { 
    bucket[socket.request.session.player.id] = socket.id; //nuuu they stealin mah bukkit 
} 

사람 연결이 끊어졌습니다.

socket.on('disconnect', function() { 
    disconnection.sid = socket.request.sessionID; //grab session id 
    disconnection.delay = setTimeout(() => { 
     //set timeout to variable, in case of reconnection 
     delete bucket[socket.request.sessionID]; 
     //emit the disconnection event 
    }, 60000); 
}); 

사용자가 연결을 끊으면 다시 연결해야하는 시간 제한을 설정하십시오.

가 다시 연결되면, 단순히 수행

io.sockets.on("connection", socket => { 
    //check for disconnection, compare socket ids, and remove timeout if sockets match 
    if (disconnection.delay && disconnection.sid == socket.request.sessionID) { 
     clearTimeout(disconnection.delay); 
     disconnection.sid = null; 
    } 
}); 

이 성공적으로 연결을 설정 한 번 더, 제한 시간을 기존 socketID의 재 연결을 확인하고 삭제합니다.

이 코드는 SourceUndead (내 게임)의 복사본이므로 일부는 직접 번역하지 않을 수도 있습니다 (예를 들어, 내 소켓 변수도 세션과 바인딩되어 있음). 단, 시간 초과 연결 끊김 개념 는 똑같은.

+0

사용자가 연결할 때마다 socketID (clientIDs)를 저장하는 bucket.push()가 있다고 가정합니까? 우리 친구들이 혼란을 피할 수 있도록 그 맛있는 가벼운 이야기를 추가하는 것이 도움이 될 것입니다 ... – sova

+1

예, 일종의 양동이는 그렇게 밀고 나가는 물건이 아닙니다. 미리보기에 추가하겠습니다. –

+0

아, 고맙습니다. – sova