chat개발

Server 2016. 12. 5. 18:20
반응형
SMALL

var avi = require('http').createServer(handler)

    , io = require('socket.io').listen(avi)

    , fs = require('fs')

  

    avi.listen(3000);


function handler (req, res) {

    console.log(__dirname);

}


var userinfo    = [];//클라이언트 전송용

io.sockets.on('connection', function (socket) {

      

      socket.room = "livingRoom";//기본은 livingRoom  이다.

    /* 대화방 전체 입장 */

    socket.on('systemIn', function (data) {

        //console.log(data);

        if(data.name)

        {

            //최초 입장시 아이디/소켓코드 저장

            socket.nickname = data.name;

            var obj = {socket_id:socket.id, nickname:data.name, room:socket.room};

            userinfo.push(obj);

            io.sockets.emit('systemIn',data);

        }

    });

    

    /* 대화방 나가기 */

    socket.on('systemOut', 

        function (data) 

        {

            socket.emit("systemOut", data);

            socket.broadcast.emit("systemOut", data);

        });

    

    /* room 으로 입장 */

    socket.on('switchRoom', 

        function(newroom) {

        var data = {};

        //사용자  룸 변경

        replaceRoom(newroom);

            

        socket.leave(socket.room);

        // join new room, received as function parameter

        socket.join(newroom);

        socket.emit('updatechat', 'SERVER', 'you have connected to '+ newroom);

        data = mkmessageTxt("public", socket.nickname, socket.nickname+'님이 퇴장했습니다.');

        io.sockets.in(socket.room).emit('message', socket.nickname, data);

        // update socket session room title

        socket.room = newroom;

        //socket.broadcast.to(newroom).emit('updatechat', 'SERVER', socket.nickname+' has joined this room');

        data = mkmessageTxt("public", socket.nickname, socket.nickname+'님이 입장했습니다.');

        io.sockets.in(newroom).emit('message', socket.nickname, data);

        

        //현재 방의 사용자 리스트 변경

        refreshUserList();

    });

    


       

    /* 대화시작 */

    socket.on('updatechat', function (data) {

        if(data.type == 'public')

        {

            io.sockets.in(socket.room).emit('message', socket.nickname, data);

        }

        else

        {

            io.sockets.in(socket.room).sockets[socket.id].emit('message',socket.nickname,data);//본인에게 메시지 전달

            io.sockets.in(socket.room).sockets[data.type].emit('message',socket.nickname,data);//귓속말 상대자에게 메시지 전달

        }

    });


    /* 브라우저를 닫은 경우 현재 방에서 퇴장하는 것으로 처리*/

    socket.on('disconnect', function () {

        if(socket.nickname){

            data = mkmessageTxt("public", socket.nickname, socket.nickname+'님이 퇴장했습니다.');

            io.sockets.in(socket.room).emit('message', socket.nickname, data);

            deleteUser();//

        }

    });

    

    /* 현재 채팅방의 사용자 리스트 가져오기 */

    var getRoomUsers = function(){

        var userList = [];

        for (var i in userinfo) {

            if(userinfo[i].room == socket.room){

                userList.push(userinfo[i]);

            }

        }

        return userList;

    }

    

    /* 현재 사용자의 채팅방 변경 */

    var replaceRoom = function(roomname){

        for (var i in userinfo) {

            if(userinfo[i].socket_id == socket.id){

                userinfo[i].room = roomname;

            }

        }

    }

    

    /* 현재 사용자 삭제 (시스템을 떠났을 경우) */

    var deleteUser  = function(){

        for (var i in userinfo) {

            if(userinfo[i].socket_id == socket.id){

                delete userinfo[i];

                userinfo.splice(i, 1)

            }

        }

        refreshUserList();

    }

    

    

    var mkmessageTxt = function(type, nickname, msg){

        var message =   {type : type, name : nickname, message : msg}

        return message;

    }

    

    /* 사용자 목록 갱신 */

    var refreshUserList = function(){

        var userList    = getRoomUsers();

        io.sockets.in(socket.room).emit('systemList',userList);

    }

           

       

 });



<meta charset="UTF-8">

    <title>우리들의 일상</title>

    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>

    <script src="http://localhost:3000/socket.io/socket.io.js"></script>

    <script type="text/javascript">


    $(function(){

        var nick_name = '';

        var socket = io.connect('http://localhost:3000');

         

        $("#enter").click(function(){

            nick_name = $('#nick_name').val();

            if(nick_name == "")

            {

                alert('닉네임을 입력하세요');

            }

            else

            {

                socket.emit('systemIn',{

                    name : nick_name

                });

 

                $("#door").slideUp(200).delay(200,function(){

                    $("#room").slideDown(200);

                });

            }

                 

        });

         

        $(".room").click(function(){

            var room = $(this).val();

            socket.emit('switchRoom', room);

            $("#room").slideUp(200).delay(200,function(){

                $("#chat").slideDown(200);

            });

        });


 

        socket.on('systemList',function(data){

            $("#nick_lst").empty();

            $("#nick_lst").append('<option value="public">모두</option>');

            for (var i in data) {

                $("#nick_lst").append('<option value="'+data[i].socket_id+'">'+data[i].nickname+'</option>');

            }

        });

         

        socket.on('systemIn',function(data){//전체 시스템에 로그인시(대화방으로는 가기전) 별도 전체 창에서 공지

 

        });

 

        socket.on('systemOut',function(data){//전체 시스템에 로그아웃시(대화방으로는 가기전)

        });

 

        socket.on('message',function(usesrname, data){//전체 시스템에 로그아웃시(대화방으로는 가기전)

            $('#msg').append('<dt>'+usesrname+' : </dt><dd>'+data.message+'</dd>');

            scrollDonw();

        });

 

        $("#txt").keypress(function(ent){

            if(ent.which == 13){

                $("#input").click();

            }

        });

         

        $("#input").bind('click',function(){

            socket.emit('updatechat',{

                type : $("#nick_lst").val(),

                name : nick_name,

                message : $("#txt").val()

            });

            $("#txt").val('');

        });

    });

    function scrollDonw()

    {

        $("#msg").animate({'scrollTop':$("#msg")[0].scrollHeight},200);

    }

    </script>

</head>

<body>


<section id="wrap">

    <header>

    <body style="background-color:powderblue;">


        <h1>이런저런 사는 이야기</h1>

    </header>

    <section>

        <div id="door">

                닉네임 : <input type="text" id="nick_name" value="">   

                <button type="button" id="enter">입장하기</button>

        </div>


        <div id="room">

            대화방선택 :

            <input type="button" class="room" value="10대방"> 

            <input type="button" class="room" value="20대방"> 

            <input type="button" class="room" value="30대방">

            <input type="button" class="room" value="40대방">

            <input type="button" class="room" value="50대방">

            <input type="button" class="room" value="직장인들을 위한방">

            <input type="button" class="room" value="여자들의 방">

        </div>


        <div id="group_select">

        성별:

        <select name="group_select" id="group_select">

        <option value="a">남성</option>     

        <option value="b">여성</option>     


        </select>


        <div id="chat">

            <dl id="msg">

            </dl>

            <div id="edit">

                <select name="nick_lst" id="nick_lst">

                    <option value="public">모두에게</option>

                </select>

                <input type="text" name="txt" id="txt">

                <button id="input">전송</button>

            </div>

        </div>

    </section>

</section>

 

</body>

</html>

반응형
LIST
블로그 이미지

만년필석사

,