Node.JS&Socket.io 채팅사이트 만들기

소스코드

이 게시물에는 코드작성이 포함되어 있습니다. 소스코드를 받으신 후 진행해 주세요. MEAN Stack/개발 환경 구축에서 설명된 프로그램들(git, npm, atom editor)이 있어야 아래의 명령어들을 실행할 수 있습니다.

git clone https://github.com/a-mean-blogger/node-js-socket-io-chatting-site.git
cd node-js-socket-io-chatting-site
git reset --hard 6886b9d
npm install
atom .

- Github에서 소스코드 보기: https://github.com/a-mean-blogger/node-js-socket-io-chatting-site/tree/6886b9d3b73d9bd2b70a3f869d4df8e8dc09d318


Node.js와 웹소켓(web socket)을 사용해서 아래와 같은 간단한 채팅사이트를 만들어 봅시다.

이 강의는 node js, Express로 아주 기초적인 서버를 제작할 수 있는 분들을 대상으로 합니다. MEAN Stack/개발 환경 구축 및 Node JS 첫걸음/Hello World!를 공부하신 후에 이 포스트를 진행하시기 바랍니다.

Web Socket

웹소켓은 웹 서버와 웹 브라우저 간의 양방향 통신을 위한 프로토콜입니다.

일반적으로 웹사이트는 요청(request)과 회신(response)로 작동합니다.  브라우저(클라이언트)에서 주소창에 주소를 입력하거나, 웹사이트의 링크를 클릭하거나 혹은 브라우저의 javascript에서 ajax 요청 등에 의해 request가 발생하는데 이 request가 서버로 전달되면 서버는 response를 만들어서 보내주게 됩니다. 이처럼 서버는 클라이언트의 request 가 없으면 데이터를 전달하지 않습니다. 항상 request가 클라이언트쪽에서 먼저 시작되고, 그 request에 대한 response만 전달됩니다.

하지만 웹 소켓은 클라이언트와 서버의 연결을 항상 유지합니다. 연결이 유지된 상태에서 서버 혹은 클라이언트상의 event(이벤트)가 발생하면(triggered) event listener에 의해 서버에서 클라이언트로, 혹은 클라이언트에서 서버로 데이터의 전달이 이루어 집니다.

event listener의 개념을 모르는 사람들을 위해 간단히 설명을 하자면, 우리가 웹사이트에서 버튼을 클릭하게 되면 'click'이라는 event가 발생됩니다. 브라우저에는 기본적으로 버튼을 클릭하는 event에 대한 코딩이 되어있어서 버튼을 누르면 form이 제출되거나 함수가 실행되거나 합니다. 이 event를 직접 만들 수도 있는데, 만약 그림이 클릭되는 경우 어떤 함수를 실행되게 하고 싶다면 직접 이 event를 코딩해 주어야 합니다. 이렇게 event와 event가 발생하는 경우 어떤 일을 할지를 코딩하여 실행하게 되면, 이 코드는 event가 발생할 때까지 기다리는데, 이를 event listener 라고 합니다.

Socket.IO

Node.js에서 web socket를 사용하기 위해 socket.io package를 사용합니다. 클라이언트나 서버에서 socket.io를 이용하여 event를 발생시킬 수 있고 이 event는 서로에게 전달됩니다. 그러면 반대편의 event listener가 이 event에 대한 반응을 하게 됩니다.

socket.io 에는 누군가 웹사이트에 접속하면 발생하는 'connection', 접속자가 웹사이트에서 이탈하면 발생하는 'disconnect' 등의 기본 event도 있고 사용자 정의 event도 만들 수 있습니다. 예를 들어 브라우저에서 A라는 버튼을 클릭하면 'A button clicked'라는 event를 발생하게 코드를 작성하고, 서버에는 'A button clicked'에 대한 event listener를 작성하여 할일을 처리하게 할 수 있습니다. 반대로 서버에서 event를 발생시키고, 브라우저에 event listener를 작성하여 서버에서 브라우저로 데이터를 전송하게 할 수도 있습니다. 이때 서버에서 발생시키는 event는 특정한 클라이언트에게 전달하게 할 수도 있고, 접속된 모든 클라이언트들에게 전달 하게 할 수도 있습니다.

위 두가지 방법을 연결하면 다음과 같은 방식으로 채팅사이트를 구현할 수 있습니다.

  1. 접속자 1이 메세지를 전송하면 브라우저에서 'send message' event를 메세지와 함께 서버로 전달함
  2. 서버에서 'send message' event listener에서 event를 감지하고 메세지를 전달받음
  3. 서버의 'send message' event listener가 'receive message' event를 메세지와 함께 접속중인 모든 클라이언트에게 보냄
  4. 접속중인 모든 클라이언트의 'receive message' event listener가 event를 감지하고 메세지를 전달받음
  5. 클라이언트들의 'receive message' event listener가 메세지를 화면에 표시함

설명이 어려운데, 예제를 살펴보면 쉽게 이해가 됩니다. 

프로젝트 생성 및 Package 설치

프로젝트 생성을 위해 새 폴더를 생성합니다. 해당 폴더에서 command line(cmd, git bash 등)에 npm init을 입력하여 node.js 프로젝트를 생성합니다.

$ npm init

프로젝트에 필요한 package도 설치해줍니다.

$ npm install express socket.io --save

프로젝트 생성과정이 이해가 잘 안되시는 분들은 MEAN Stack/개발 환경 구축을 다시 한번 읽어 주시기 바랍니다.

폴더 구조


프로젝트 폴더(chatting)를 만들고 server.js파일과 client파일을 생성해 줍니다. 회색 파일들은 git과 github을 위한 파일들이며, package.json은 npm init을 하면 자동으로 생성됩니다.

코드

// server.js

var express = require('express');
var app = express();
var http = require('http').Server(app); //1
var io = require('socket.io')(http);    //1

app.get('/',function(req, res){  //2
  res.sendFile(__dirname + '/client.html');
});

var count=1;
io.on('connection', function(socket){ //3
  console.log('user connected: ', socket.id);  //3-1
  var name = "user" + count++;                 //3-1
  io.to(socket.id).emit('change name',name);   //3-1

  socket.on('disconnect', function(){ //3-2
    console.log('user disconnected: ', socket.id);
  });

  socket.on('send message', function(name,text){ //3-3
    var msg = name + ' : ' + text;
    console.log(msg);
    io.emit('receive message', msg);
  });
});

http.listen(3000, function(){ //4
  console.log('server on!');
});

1. socket.io를 사용하는 경우 Node JS 첫걸음/Hello World!에서와는 다르게 app를 http에 연결시키고, 이 http를 다시 socket.io에 연결시키는 과정이 필요합니다. 이는 socket.io가 express를 직접 받아들이지 못하기 때문입니다. socket.io는 io라는 변수명으로 서버에서 사용됩니다.

2. 모든 request는 client.html를 response하도록 설정하였습니다.

3. 사용자가 웹사이트에 접속하게 되면 socket.io에 의해 'connection' event가 자동으로 발생됩니다. io.on(EVENT,함수)는 서버에 전달된 EVENT를 인식하여 함수를 실행시키는 event listener입니다. 이때 함수에는 접속한 사용자의 socket이 parameter로 전달됩니다. 해당 접속자(socket)에 관련한 event들은 이 'connection' event listener 안에 작성되어야 합니다.

3-1. 'connection' event listener에 event가 발생하면 한번만 일어나는 코드들입니다. console.log로 접속자의 socket.id를 출력하고 사용자 이름을 만든 후 'change name'이란 event를 발생시킵니다. emit는 '(빛 따위를) 발하다'라는 뜻으로 event를 발생시키는 함수입니다. 이 event는 client.html의 해당 event listener에서 처리됩니다. io.to(socket.id).emit 을 사용하여 해당 socket.id에만 event를 전달합니다.

3-2. socket.io(EVENT,함수)는 해당 socket에 전달된 EVENT를 인식하여 함수를 실행시키는 event listener입니다. 접속자의 접속이 해제되는 경우 socket.io에 의해 'disconnect' event가 자동으로 발생됩니다. console.log로 socket.id를 출력합니다.

3-3. 3-2와 처럼 socket.io를 사용한 'send message' event의 event listener입니다. 이 event는 client.html에 작성된 사용자 정의 event로 접속자가 채팅메세지를 전송하는 경우에 발생합니다. 이 event는 채팅메세지를 보낸 접속자의 이름과 채팅메세지를 parameter로 함께 전달합니다. 'send message' event listener는 이 event를 받은 후 io.emit을 사용하여 모든 클라이언트들에게 event를 전달합니다.

4. app.listen이 아닌 http.listen임에 유의합시다.

다음은 client.html입니다. 강좌를 socket.io에 집중하기 위해 style css, script를 html 안에 작성하였습니다.

<!-- client.html -->

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Chat</title>
    <style>
      .chat_log{ width: 95%; height: 200px; }
      .name{ width: 10%; }
      .message{ width: 70%; }
      .chat{ width: 10%; }
    </style>
  </head>
  <body>
    <div>
      <textarea id="chatLog" class="chat_log" readonly></textarea>
    </div>
    <form id="chat">
      <input id="name" class="name" type="text" readonly>
      <input id="message" class="message" type="text">
      <input type="submit" class="chat" value="chat"/>
    </form>
    <div id="box" class="box">
    <script src="/socket.io/socket.io.js"></script> <!-- 1 -->
    <script src="//code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      var socket = io(); //1
      $('#chat').on('submit', function(e){ //2
        socket.emit('send message', $('#name').val(), $('#message').val());
        $('#message').val('');
        $('#message').focus();
        e.preventDefault();
      });
      socket.on('receive message', function(msg){ //3
        $('#chatLog').append(msg+'\n');
        $('#chatLog').scrollTop($('#chatLog')[0].scrollHeight);
      });
      socket.on('change name', function(name){ //4
        $('#name').val(name);
      });
    </script>
  </body>
</html>

1. socket.io를 사용하기 위해 반드시 필요한 과정입니다. socket.io.js를 가져오고, socket 변수를 설정합니다.

2. jQuery의 'submit' event listener입니다. 입력창이 submit되면 서버로 'send message' 사용자 정의 event와 이름, 채팅메세지를 전달(emit)합니다. 이후 message에 내용를 지워주고 focus를 해 준 후 event를 정지합니다.

3. socket의 'receive message' event listener입니다. 서버에서 'receive message' event가 emit되면 message를 '#chatLog'에 추가하고 스크롤을 합니다. 이 event는 server.js의 #3-3에서 발생합니다.

4. socket의 'change name' event listener입니다. 서버에서 'change name' event가 emit되면 '#name'에 이름을 변경합니다. 이 event는 server.js의 #3-1에서 발생합니다.

실행결과

nodemon을 사용해서 서버를 실행합시다

$ nodemon

http://localhost:3000 로 접속합니다. 탭을 두개 띄우고 서로 각각의 탭에 메세지를 입력해 봅시다.


이때 콘솔을 보면 아래와 같이 메세지가 표시되는 것을 확인할 수 있습니다.

마치며...

코드는 그렇게 많지도 않고 어렵지도 않죠? 아래 내용을 잘 숙지합시다.

  • io object는 서버가 만들거나 받는 event를 담당,  socket object는 개별의 클라이언트의 socket이 만들거나 받는 event를 담당
  • 'connection' event는 사이트 접속이 일어날때 서버가 받는 event이므로 io.on('connection', 함수)가 event lister
  • 'disconnect' event는 개별 클라이언트가 접속이 끊어졌을 때 해당 socket이 받는 event이므로 socket.on('disconnect', 함수)가 event listener
  • 사용자 정의 이벤트들 역시 개별 socket이 받는 event이므로 socket.on('disconnect', 함수)가 event listener
  • 클라이언트에서 socket을 통해 event를 서버로 전달: socket.emit 
  • 서버가 event를 하나의 특정한 클라이언트에게만 전달: io.to(socket.id).emit 
  • 서버가 event를 모든 클라이언트들에게 전달: io.emit

관련 게시물


댓글

김병식 2017.08.11
좋은 예제 감사합니다. 공부하는데 도움되었네용 ^^
I
Ian H 2017.08.11
@김병식,
반갑습니다  자주 방문해 주세요^^
허람 2017.08.14
블로그 게시글 참고하여 노드js와 heroku를 이용해 실시간 채팅을 구현했습니다. 그런데 채팅이란게 여러개의 채팅방에서 채팅이 가능하지않습니까? 서버를 하나만 열고 여러개의 채팅방을 만드는 방법이 궁금합니다..강좌나 참고할수잇는 주소없을까용
I
Ian H 2017.08.14
@허람,
Socket.io에서 room을 만들 수 있습니다 특정 room에 접속하고 특정 그룹에만 emit을 보낼 수 있죠 https://socket.io/docs/rooms-and-namespaces
허람 2017.08.14
@Ian H,
오 감사합니다. 사이트가 영어지만 열심히 찾아봐야겠어요! 죄송하지만 디비를 커넥트할때  어떻게 하죠? 서버에서 커넥트할 줄은 아는데 클라이언트에서 서버에 있는 커넥트를 어떻게 사용할지 모르겠어요.. 역시 강좌나 참고할수있는 주소가 있다면 도와주세요 감사합니다
I
Ian H 2017.08.14
@허람,
넹.. 사이트가 영어죠. 채팅방만드는 강좌도 나중에 올려보도록 하겠습니다(나중에...). 클라이언트는 서버를 통해서 DB를 조작해야합니다. http://a-mean-blog.com/ko/blog/Node-JS-API로 API를 만들고 AJAX를 통해서 API호출해서 DB를 조작하면 되겠습니다.
허람 2017.08.16
@Ian H,
감사합니다 공부하는데 정말 도움이 많이되고있어요 앞으로도 좋은 강좌 많이올려주세요~ㅎㅎ
재귀함수 2017.08.17
자세하고 친절한 강좌 감사합니다. 많은 도움 되었습니다.
본 채팅 시스템을 heroku에 업로드해 동작시켜 보았습니다만 몇가지 궁금한 점이 생겨 질문드립니다. heroku에서 node.js 어플리케이션을 돌릴 땐, local환경에서 bash 창에 $ nodemon 이나 $ node server.js 같은 커맨드를 입력하는 것과 같은 과정이 없어도 서버가 항상 열려 있는 것인가요? 혹 그렇다면 server.js에서의 console.log 등은 어디서 어떻게 확인할 수 있는지요?
I
Ian H 2017.08.17
@재귀함수,
heroku는 사이트가 개시된 후 package.json의 scripts.start에 기록된 명령어를 실행해서 서버를 실행합니다. 이후 서버는 계속 열려있게 됩니다. heroku 무료버전을 쓰고 계신다면 서버에 30분간 접속이 없는 경우 서버를 종료시키고, 이 후 접속이 있는 경우 다시 서버를 실행합니다.
console.log는 heroku logs 명령어를 통해 확인할 수 있습니다. (http://www.a-mean-blog.com/ko/blog/단편강좌/_/Heroku-헤로쿠-가입-Heroku-CLI-다운로드-간단-사용법#Heroku-CLI-중요-명령어들 참고)
재귀함수 2017.08.18
@Ian H,
감사합니다!
재귀함수 2017.08.18
사족이지만 heroku 설정에서 web dyno를 끄고 켜는 것으로 조절할 수 있군요. web dyno가 heroku 상에서 일종의 프로세스가 되는 것인가요?
I
Ian H 2017.09.08
@재귀함수,
맞습니다!
d
doogis94 2017.09.21
초보자가 참고하기 좋은글인거같습니다 이해하는데 정말 많은 도움이되었습니다 혹시 nodeon 명령어로 작동을 한다고그러셨는데 node server.js랑 같은 역할을 하는지 궁금합니다 또 이 채팅을 외부에서 접속할수있게 localhost:3000가 아닌 www.mydomain.com/chat 이런식으로 접속하고싶은데 웹서버의 루트경로에 chat폴터를 만들어서 접속에는 성공했는데 서버측 콘솔에서 아무것도 안뜹니다 혹시 따로 설정해줘야될게있을까요?
I
Ian H 2017.09.22
@doogis94,
nodemon에 대한 설명은 http://www.a-mean-blog.com/ko/blog/토막글/_/Node-Package-Nodemon 글을 읽어 주시기 바랍니다. 지금보니 nodemon에 대한 설명이 부족한 것 같아서 해당 게시물을 업데이트하였습니다.
제가 서버 설정에 대한 지식이 전혀 없는 관계로 두번째 질문은 답변해 드릴수가 없네요 ㅠㅠ 만드신 채팅사이트를 실제 인터넷에서 확인하고 싶으시면 http://www.a-mean-blog.com/ko/blog/단편강좌/_/Node-js-사이트-Heroku-헤로쿠-로-인터넷에-올리기 글을 읽어 주시기 바랍니다.
H
HYEOK999 2017.11.18
 안녕하세요. 다름아니라 JSP(Spring)으로 채팅 페이지를 구현하려고 합니다.
현재 환경이 서버로 돌아가는 컴퓨터가 1대 있고 해당 컴퓨터에서 DB로 정보를 받고 view페이지로 뿌려주는 식입니다. 제 컴퓨터에서 MySQL Workbech로 서버컴의 DB와 연결이 되어있는 상태인데요.
제가 궁금한것은 이번에는 node.js를 공부하면서 socket에 대해서도 알게 되었는데요. 제가 채팅페이지를 구현하려면 클라이언트 소스와 서버소스를 구현해야된다는 것을 알게되었습니다. 클라이언트 소스를 제 컴퓨터로 구현을 하고 서버 소스는 서버컴쪽에 구현을 해야되는건가요?... 이부분에 대해서 너무 헷갈립니다.
I
Ian H 2017.11.18
@HYEOK999,
여기서 서버란 웹 요청(request)을 받는 시스템으로 자바 스프링에 웹소켓 라이브러리를 찾아보시면 될 듯합니다.
클라이언트는 웹 페이지에 접속하는 이용자입니다. 자바스크립트로 코딩하여 접속자의 브라우저에서 코드가 돌아가게 됩니다.
그래 2018.01.09
안녕하세요. 좋은 정보 감사드립니다.  궁금한 것이 있는데요.  위 채팅 소스에서 서버에서만 입력이 가능하고  접속하는 클라이언트들은 입력폼 없이 모두 서버가 입력하는 내용을 보는 것만 가능하도록 만들고 싶은데(버튼을 따로 배치하여 폰트 크기나 짧은 단어 정도는 송출) 어느 부분을 수정하면 될지 궁금합니다.
I
Ian H 2018.01.09
@그래,
위 코드에서 클라이언트 입력창과 입력함수를 없애버리고 서버에서 데이터를 수동으로 업데이트해 주면 되겠네요
그래 2018.01.10
답변 감사드립니다.  한 가지만 더 여쭤보겠습니다. 채팅 텍스트가 입력 후 전송하면  기본적으로 한 줄씩 표시가 되는데  이 부분을 append처럼 줄바꿈 없이 쭉 이어서 출력하다가  마침표 같은 문장부호가 나타났을 때(특정 조건) 즉, 전송되는 데이터 안에 마침표가 있을 때는 줄바꿈이 일어나도록  할 수도 있을까요? 가능하다면 방법이 좀 알고 싶습니다.
I
Ian H 2018.01.10
@그래,
여러가지 방법이 있겠지만.. 가장 쉬운 방법은 string replace같습니다.
브라우저 콘솔에  "안녕하세요. 반갑습니다!".replace(".","\n") 를 입력해 보세요.
이렇게 서버에서 문자열을 처리한 후에 보내는 거죠.
안준휘 2018.03.15
감사합니다 덕분에 많은 도움이 되었어요 !!
I
Ian H 2018.03.15
@안준휘,
도움이 될 수 있어서 기쁘네요^^
n
nodemon 2018.04.27
엇 제글이 지워졌네요 ㅠㅠ
https(443port)로 접속하는사이트에 채팅기능을 추가하려고 대입해보니 (채팅3000port)
3000port로는 채팅창화면나오고 user1 나오고 채팅 정상작동하는데
443 또는 80port로 접속해서 /chatting 접속시 채팅창화면은 나오는데 user1부분이 빈칸으로나오고 채팅입력하면 입력안되며 cmd창은 변화없습니다
포트가달라서그런거같은데 어떻게 route(게시판/채팅창) 옮겨가며이용할수있을까요?
client.html 파일에서 var socket = io(); 여기 괄호에다가 ("https://홈페이지주소:443노드서버포트")
이렇게 하는방식을 찾았는데 안되더라구요...
I
Ian H 2018.04.27
@nodemon,
안녕하세요. socket.io는 서버포트와는 상관없이 client 파일(html)과 host서버가 같은 서버에 있으면 var socket = io()로 작동하게 되어 있습니다. 서버가 다르다면 var socket = io(호스트서버주소)로 작동하구요.
방법은 맞는데 안된다면 아마 서버 설정이 잘 안맞는 것 같습니다. 한번 확인해 보세요
n
nodemon 2018.04.28
@Ian H,
와우 서버설정이었다니 나무만보고앉았었네요 서버설정쪽으로 방향잡고 이짓저짓다해보다가 결국 됬어요!! 감사합니다ㅠㅠ 채팅사이트만들기 후속강의 간절히 바라고 있겟습니다!! 행복한 주말 보내세요 :)
I
Ian H 2018.05.03
@nodemon,
요즘 너무 바빠서 블로그에 답변만 간신히 달고 있어요 엉엉ㅠㅠ
l
lol 2018.05.30
궁금한게 있습니다. 만약 채팅방엔 그대로 유저가 존재하지만 로그인 안된 상대에게 메시지를 보내려면 어떻게 해야할까요? 예를들면 카카오톡 같은것을 보면 인터넷이 안되어도 나중에 인터넷연결되면 메시지가 날라오는 것을 알 수 있는데요.
I
Ian H 2018.05.30
@lol,
메세지 프로그램의 경우엔 DB에 기록해 두었다가 유저가 로그인하면 그때 알려주게 됩니다.
이현준 2018.09.18
제가여 이걸 좀더 개발해서 채팅 프로그램으로 만들고 싶은대 유저 이름을 아예 재가 쓰게 만드려면 어떤 코드를 사용해야 할까요? 참고로 저 초 6이에요... 프로그래밍이 너무 재미있어서 공부하고 있는대, 물어보고 싶은거 다 물어볼게요. 1. 유저 이름을 아예 사람이 치면 좋겠어요. 유저 이름이 한정적으로 user1, user2, user3, user4, user n 이렇게 정해저 있으니까 실재로 이용할때는 너무 불편해요... 유저 이름을 자기가 쓰는 방식으로 바꿀순 없을까요?
2. 채팅창 뒤에 바탕을 넣고 싶어요. 채팅창 뒤에 바탕을 넣고 싶은데, client.html 에서 수정을 해야 하는거예요, 아님 서버에서 수정해야 하는거에요
3. 완전 채팅 프로그램 처럼 만들고 싶은데, 어떻게 할 순 없을까요? ex) 바탕이 잇고, 아래에다 할말을 적고, 오른쪽에 올리기 버튼이 있고, 채팅 화면과 쓰는화면이 붙어있는 그런 프로그램 이런 프로그램 만드는게 재 소원일것 같아요...
참고로 저 컴퓨터 자격증도 잇어요... DIAT, ITQ, GTQ(이제곳 딸거임) 강의 같은걸 올려주시면 정말정말 감사하겟습니다... 평안하세요~
                                                                                                                     - 초등 6학년 이현준 올림
I
Ian H 2018.09.18
@이현준,
안녕하세요. 프로그래밍의 가장 큰 재미는 소스코드가 있으면 내 입맛대로 바꿀 수 있다는 점이죠.  위 소스코드를 바탕으로 요청하신 1, 2, 3번의 기능을 추가&변경 하실 수 있습니다. 하지만 제가 코드를 짜드릴 순 없구요, 힌트를 드릴게요^^
1. 유저의 이름을 바꾸고 싶다면, 지금 현재 유저의 이름이 어떻게 정해지는 알고 그 부분을 수정하면 되겠죠. 위 강의에서 server.js파일의 3-1 부분을 참고해서 기능을 추가해 보세요. 물론 유저의 이름을 client에서 받아오는 부분도 필요할 거에요. 위 강의를 이해하였다면 client와 server 사이에 정보를 주고받을 수 있을테니 하실 수 있을 겁니다.
2&3 바탕을 넣고, 버튼의 위치를 조절하고 채팅화면과 쓰는화면사이의 간격을 없애고 등등의 보여지지는 부분은 CSS style을 수정하면 됩니다. 어려운 부분이 아니니 인터넷에서 자료를 찾아서 쉽게 적용할 수 있을 거에요.
화이팅!
이현준 2018.09.25
드디어 성공하였습니다. 로그인 화면을 아에 만들어서 소스코드를 엄청쉽게 짤 수 잇엇어요. 감사합니다!
I
Ian H 2018.09.25
@이현준,
와 축하합니다!^^
이우상 2019.09.10
쉽고 간단하면서도 꽉 찬 내용이네요! 정말 큰 도움 되었습니다!! 감사합니다~
I
Ian H 2019.09.11
@이우상,
socket 재밌죠 ㅋㅋ 이걸 응용하면 실시간 온라인 게임을 만들 수 있습니다!
M
Minhee Son 2019.09.27
소켓 io 를 공부해야하는 상황이었는데 덕분에 쉽게 공부하고 적용할 수 있었습니다. 감사드립니다!
I
Ian H 2019.09.28
@Minhee Son,
도움이 되었다니 기쁩니다^^ 감사합니다!
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP