본문 바로가기
Javascript

Visual Studio Node.js 1:1채팅(3) Client

by NaHyungMin 2020. 7. 30.

2020/07/30 - [Linux] - Centos7 Node.js 배포하기

2020/07/30 - [Javascript] - Visual Studio Node.js 1:1채팅(3) Client

2020/07/30 - [Javascript] - Visual Studio Node.js 1:1 채팅(2) Server.js

2020/07/30 - [Javascript] - Visual Studio Node.js 1:1 채팅하기(1)

2020/07/30 - [Javascript] - Node.js 윈도우 코드 환경 Visual Studio 2019

 

 

Server.js에 있는 /index2.html에 대한 정보다.

 

이름은 편하게 만들어주면 된다.

왜 index2냐고는 묻지마라 -..-;

 

<!doctype html>
<html lang="ko">
<head>
    <title>대화방</title>
  
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font: 13px Helvetica, Arial;
        }

        form {
            background: #000;
            padding: 3px;
            position: fixed;
            bottom: 0;
            width: 100%;
        }

            form input {
                border: 0;
                padding: 10px;
                width: 90%;
                margin-right: 0.5%;
            }

            form button {
                width: 9%;
                background: rgb(130, 224, 255);
                border: none;
                padding: 10px;
            }

        #messages {
            list-style-type: none;
            margin: 0;
            padding: 0;
        }

            #messages li {
                padding: 5px 10px;
            }

                #messages li:nth-child(odd) {
                    background: #eee;
                }
    </style>
</head>
<body>
    <ul id="messages"></ul>
    <form action="">
        <input id="m" autocomplete="off" />
        <button>Send</button>
    </form>
    <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
        $(() => {
            const room = window.location.search;
            var name = "";
            const socket = io(); //(room);

            socket.emit('joinRoom', room);

            $('form').submit(() => {
                socket.emit('chat message', room, name, $('#m').val());
                $('#m').val('');
                return false;
            });

            socket.on('chat message', (name, msg) => {
                $('#messages').append($('<li>').text(name + '  :  ' +
                    msg));
            });

            //socket.on('leaveRoom', (room, name) => {
            //    $('#messages').append($('<li>').text(name + '    leaved '
            //        + "채팅방 떠남" + ' :('));
            //});

            socket.on('joinRoom', (userName) => {
                if (name === "") {
                    name = userName;
                }

                $('#messages').append($('<li>').text(userName + ' 님이 방에 입장하셨습니다.'));
            });

            socket.on('disconnect', function () {
                $('#messages').append($('<li>').text("상대방이 채팅방에서 퇴장하였습니다."));
                socket.emit('endChat', room);
            });

            window.onbeforeunload = function () {
                return "";
            };
        });
    </script>
</body>
</html>

 

대화방 css는 훔쳐왔다. 휙휙.

 

const socket = io(); //(room);

 

node.js는 네임스페이스(자바로 치면 패키지) 같은 접두사?를 통해, 지역을 활성화 하는듯 하다.

예를 들어, 송파구, 광진구라는 namespace를 통해 서로 다른 방 이름을 가질 수 있는듯. (송파구.방1, 광진구.방1)

 

socket.emit('joinRoom', room);

접속을 완료하면, 서버에 약속된 명령어인 joinRoom을 호출한다.

 

그러면 서버에 있는 얘가 호출된다.

socket.on('joinRoom', (search) => {
        search = decodeURIComponent(search);
        var userName = getParam(search, "username");
        roomKey = getRoomKey(search);
        var room = userRooms[roomKey];

        if (typeof room === "undefined") {
            socket.join(socket.id);
            userRooms[roomKey] = socket.id;
        } else {
            var socketId = userRooms[roomKey];
            socket.join(socketId);
        }

        io.to(userRooms[roomKey]).emit('joinRoom', userName); //클라이언트 callback
    });

 

얘는 클라이언트가 보내온 명령어를 처리한 후에 채팅방에 userName을 던져준다.

그러면 클라이언트는 다시 서버에서 보내온 정보를 다음과 같이 받는다.

 

socket.on('joinRoom', (userName) => {
     if (name === "") {
     name = userName;
     }

	$('#messages').append($('<li>').text(userName + ' 님이 방에 입장하셨습니다.'));
});

서버에서 보내온 joinRoom을 html로 뿌려준다.

다른 명령어도 동일하다.

 

클라이언트가 버튼을 눌러 이벤트를 호출하든, 서버에서 해당 소켓에 이벤트가 호출되어 클라이언트한테 알리든가.

<form action="">
	<input id="m" autocomplete="off" />
	<button>Send</button>
</form>

버튼을 누르면 처음 html 생성될 때 만들어진 다음 이벤트를 호출

 

  $('form').submit(() => {
  	socket.emit('chat message', room, name, $('#m').val());
  	$('#m').val('');
  	return false;
  });
socket.on('disconnect', function () {
	$('#messages').append($('<li>').text("상대방이 채팅방에서 퇴장하였습니다."));
	socket.emit('endChat', room);
})

상대방이 채팅을 나갔을 때, 채팅방을 없애달라라고 마지막 사람이 바로 종료가 온다.