[작업사항]
1. Node js 서버에서 Matching system 구현 및 Disconnection 핸들링
[작업사항 세부 설명]
1. 어제 Node js 서버 이전 작업을 한 뒤에, 오늘 출근한 뒤에 잠시 안드로이드 이미지 전송 작업을 실시하였다. 어제와 동일한 문제를 해결하기 위해 새로운 몇가지 방법을 시도해보았으나 아직까지 서버내에 이미지가 저장되지는 않고 있다. 이미지 전송 작업은 다시 뒤로 미루고, node js 서버내에서 Matching system 작업에 전념하였다. 손으로 작성한 알고리즘 도식을 토대로 내가 생각한 기능들에 해당하는 문법요소들은 그때그때 찾아가면서 프로그래밍하였다. (다행스럽게도 내가 생각한 기능 모두 존재하였다.) 아직까지는 랜덤매칭이 아니라 들어온 순서대로 매칭시켜주는 시스템이지만 기존에 우려하였던 room master와 room customer 가 각각 따로 접속을 종료하였을 때의 처리는 제대로 해준 것 같다. 말로 설명하기 조금 어렵지만 예상되었던 문제는 다음과 같다. 게임이 종료되는 여러 시나리오 중에 방장이 먼저 게임방에서 나가는 경우에, 방의 id는 방장의 id이기 때문에 방에 남아있는 클라이언트를 활용할 방법이 없어진다. 방1개에 클라리언트1개가 배정되어 있지만 포인터를 잃어버린 것처럼, 다른 클라이언트가 서버에 접속할 때, 매칭없이 새로운 방을 생성하게 된다!
이것을 클라이언트가 연결을 종료하는 이벤트(disconnection)에 대한 이벤트 콜백함수를 적절하게 구현함으로써 해결하였다. 방장 역할을 하는 클라이언트가 나갔을 때와, 손님역할을 하는 클라이언트가방에서 나갔을 때의 금일 작성한 코드의 일부를 첨부한다.
socket.on('disconnection', function(){
console.log('disconnect requested.. ' + socket.id);
socket.get('room', function(err, room){
if(err) {
console.log('socket.get error');
} else {
//1. 방에서 떠난 애가 방장이었을 경우 -> 방장을 바꿔줘야함(key 변경)
//2. 방에서 떠난 애가 참여자였을 경우 -> 그냥 얘만 없애면 됨
if(socket.id == room){ //1번
var client = io.sockets.clients(room); //room 안에 클라이언트 목록
//console.log(client[1]); ->client[1] == socket. socket info
//client[0] -> 방장 socket client[1] -> 참여자 socket
//일단 방 폭파 시키고 현재 참여자를 새로 방 만들어야 할듯
var tempClient = client[1];
//console.log(tempClient.id); -> ok
client[1].leave(room); //참여자 방 아웃 시킴.. 되었겠지?
tempClient.join(tempClient.id); //참여자 이름으로 새로운 방을 만듬 -> ok
}
//io.sockets.in(room).emit('oppositedisconnection'); //상대방 disconnection 알림이벤트 지금은 걸릴일 없을듯
//socketRoom.removeElement(socketRoom.indexOf(socket.id)); //방폭파하는 경우이므로 현재 방목록에서 삭제해야함. 그런데 방이 오히려 추가된다..?
delete socketRoom[socket.id];//socket.id에 해당하는 방을 방목록에서 삭제.
for(var i=0; i<socketRoom.length; i++){
if(socketRoom[i] == ''){
socketRoom.removeElement(i);
}
}
/* 위에서 방 삭제하고 나서 출력하는 건데 기존방은 사라지고 새로운방 만들어지지만 쓸데 없는 방이 하나 출력됨
for(var arr in socketRoom){
console.log('cccccccccccccccccccccc ' + arr);
}*/
socket.leave(room); //방에서 떠남
}
});
});