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>
클라이언트 측 소스는 중요한 부분만 넣었습니다.
좋은 정보 감사합니다.