NodeJS 채팅방 소스

NodeJS 채팅방 소스

 

홈페이지에 간단하게 고객응대용 채팅방을 달기위해 제작한 소스입니다.

 

server.js

// Socket.IO 모듈 로드
var io = require('socket.io').listen(3000);

// 접속자 정보를 담아둘 배열
var client_list = [];

// 소켓 접속
io.sockets.on('connection', function(socket) {

    // 룸 이름은 chatroom로 설정한다.
    socket.room = "chatroom";

    // 사용자 접속시 실행
    socket.on('systemIn', function(data) {

        // 필수정보가 포함되지 않을경우 리턴한다.
        if( ! data.nickname || !data.session_id ) return false;

        // 소켓에 정보를 추가한다.
        socket.nickname = data.nickname;
        socket.is_mobile = data.is_mobile;
        socket.session_id = data.session_id;

        // 목록에 추가할 객체 생성
        var obj = {
            socket_id : socket.id,
            nickname : socket.nickname,
            is_mobile : socket.is_mobile,
            session_id : socket.session_id
        };

        // 현재 클라이언트 목록중에 같은세션을 가지고 있는사람이 있는가?
        for(var k in client_list) {
            if( client_list[k].session_id == obj.session_id ) {
                    obj.nickname = client_list[k].nickname;
                    socket.nickname = client_list[k].nickname;
                    socket.emit('rename_nickname', client_list[k].nickname);
                }
            }
            client_list.push( obj );
            io.sockets.emit( 'client_connect', obj );
        }

        // 현재 소켓을 Room에 참가시킨다.
        socket.join(socket.room);
    });

    // 사용자 접속해제시 실행한다.
    socket.on('disconnect', function(){
        // 필수정보가 없다면 리턴
        if( ! socket.session_id )  return false;

        // 사용자  목록에서 삭제
        for( var i in client_list ) {
            if( client_list[i].socket_id == socket.id ) {
                io.sockets.emit( 'client_connect', client_list[i] );
                client_list.splice(i, 1);
            }
        }
    });

    // 사용자 목록 요청
    socket.on('get_client_list', function() {
        socket.emit('get_client_list', client_list);
    });

    // 채팅 메시지
    socket.on('chat_message', function( data ) {
        data.socket_id = socket.id;
        data.session_id = socket.session_id;
        data.nickname = socket.nickname;

        // 전체 말하기일 경우
        if( typeof data.type != 'undefined' && data.type == "ALL") {
            io.sockets.emit('message', data);
        }
        else {          
            // 메시지 타겟 ID에게 발송
            // 해당세션과 동일한 세션에 전부 발송
            for (var i in client_list) {
                if( client_list[i].session_id == data.target_session ) {
                    io.to( client_list[i].socket_id ).emit('message', data);
                }
            }
            // 본인에게 전송
            socket.emit('message', data);            
        }
    });
});

 

클라이언트측 소스

<script src="//cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
var guest_name = "손님 " + Math.floor(Math.random() * 1000) + 1;
var session_id = "<?php echo session_id();?>";

$(function(){
    // 서버에서 이전 닉네임이 있을경우 현재 닉네임을 교체해준다.
    socket.on('rename_nickname', function(data) {
        guest_name = data;
    });

    // 접속 알림
    socket.emit('systemIn', {
	nickname : guest_name,
	session_id: session_id,
	is_mobile : is_mobile
    });

    // 메시지를 받았을때
    socket.on('message',function(data){        
	if( data.nickname == guest_name && data.session_id == session_id ) {
    	    // 내가 보낸 메시지라면    
	}
	else {
	    // 상대방이 보낸 메시지라면
	}        
        
        // 채팅창 스크롤을 아래로 내려줌
        $("#msg-container").animate({'scrollTop':$("#msg-container")[0].scrollHeight}, 200);
    });
});

</script>

클라이언트 측 소스는 중요한 부분만 넣었습니다.

1 thought on “NodeJS 채팅방 소스”

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

This site uses Akismet to reduce spam. Learn how your comment data is processed.