관리 메뉴

ChangHoon's IT Blog

[Node.js] 실시간 채팅 서비스 4 - Socket.io 기초 본문

Node.js

[Node.js] 실시간 채팅 서비스 4 - Socket.io 기초

Hoonss 2019. 11. 6. 23:53

안녕하세요!

 

 

이번 강좌에서는 지난 포스팅에 이어서

Socket.io를 이용한 실시간 데이터 송/수신을 구현해보도록 하겠습니다!

 

 

 

[목차]

 

1. 서버 코드 작성

2. HTML 수정

3. 클라이언트 자바스크립트 생성

4. 클라이언트 코드 작성

5. 테스트

 


먼저 코드의 소스코드를 작성해줍니다.

 

io.sockets.on('connection', function(socket) { 
   console.log('유저 접속 됨') 
 
 
   socket.on('send', function(data) { 
     console.log('전달된 메시지:', data.msg) 
   }) 
 
 
   socket.on('disconnect', function() { 
     console.log('접속 종료') 
   }) 
 }) 
 
 
 /* 서버를 8080 포트로 listen */ 
 server.listen(8080, function() { 
   console.log('서버 실행 중..') 
 }) 

server.listen 위에다가 위 처럼 작성해주세요!

 

on()은 소켓에서 해당 이벤트를 받으면 콜백함수가 실행됩니다!

 

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

 

부분은 connection 이라는 이벤트가 발생할 경우 콜백함수가 실행됩니다.

 

 

io.sockets 는 접속되는 모든 소켓들을 의미하구요

 

접속과 동시에 콜백함수로 전달되는 소켓은 접속된 해당 소켓 입니다.

 

콜백함수 안에서 해당 소켓과 통신할 코드를 작성하시면 됩니다!

 

socket.on('send', function(...))

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

 

위의 2기능을 가진 코드가 있는데요

 

첫 번째는 send 라는 이벤트를 받을경우 호출이 됩니다.

두 번째는 disconnect인데 socket.io 기본 이벤트입니다!

 

연결되어있던 소켓과 접속이 끊어지면 자동으로 실행이 됩니다.

 

서버측 코드는 마무리 되었습니다.

 

 

index.html을 수정해줍니다.

 

<!DOCTYPE html> 
 <html> 
   <head> 
     <meta charset="utf-8"> 
     <title>채팅</title> 
     <link rel="stylesheet" href="/css/index.css"> 
     <script src="/socket.io/socket.io.js"></script> 
     <script src="/js/index.js"></script> 
   </head> 
   <body> 
     <div id="main"> 
       <input type="text" id="test"> 
       <button onclick="send()">전송</button> 
     </div> 
   </body> 
 </html> 

다 마무리 하셨으면 js 폴더에 index.js 파일을 생성해줍니다.

 

var socket = io() 
 
 /* 접속 되었을 때 실행 */ 
 socket.on('connect', function() { 
   var input = document.getElementById('test') 
   input.value = '접속 됨' 
 }) 
 
 
 /* 전송 함수 */ 
 function send() { 
   // 입력되어있는 데이터 가져오기 
   var message = document.getElementById('test').value 
    
   // 가져왔으니 데이터 빈칸으로 변경 
   document.getElementById('test').value = '' 
 
 
   // 서버로 send 이벤트 전달 + 데이터와 함께 
   socket.emit('send', {msg: message}) 
 } 

클라이언트에서는 connection 이벤트가 아니라 connect 입니다!

 

위 코드를 설명드리자면

 

 

먼저 서버와 소켓이 연결되었을 때 id가 test인 요소의 값을 '접속 됨' 으로 설정합니다.

 

아래의 send 함수는 버튼을 클릭했을 때 호출이 되는데요

id가 test인 요소의 값을 서버로 전송하는 코드입니다!

 

중요한점은 socket.emit('send' ...) 이벤트 명입니다!

 

on은 수신, emit은 전송이라고 이해하시면 되는데요

 

send라는 이름의 이벤트를 전송했으면 받는곳에서는 on('send') 가 있어야 받을 수 있습니다.

 

이벤트명이 동일한것 끼리만 데이터 송/수신이 가능합니다!

 

만약 전송하는 부분에서는 emit('aa')라고 코드를 작성했는데

수신하는 부분에서 on('ab') 라고 한다면 전달 받을 수 없습니다.

 

모두 작성을 마치고 저장한 뒤에 서버를 실행시켜 봅니다.

 

터미널을 열고 node app.js를 입력하면

 

'유저 접속됨' 문자가 콘솔에 찍는 것을 확인하실 수 있습니다.

 

그리고 클라이언트도 확인해보시면 아래와 같이 바뀌었을 겁니다.

원상태는 빈 칸 이지만, 클라이언트 측의 connect 이벤트가 수신되고 id가 test인 요소의 값을 '접속 됨'으로 변경하였기 때문에

위와같이 값이 추가되었습니다.

 

원래있던 내용을 지우고 전송버튼을 눌러봅시다

 

서버의 콘솔을 확인해보시면 정상적으로 데이터가 전달되는 모습을 보실 수 있습니다!

 

Socket.io로 실시간으로 데이터를 송/수신하는 예제를 작성해보았습니다!

 

다음 시간에는 UI를 꾸미고 채팅 기능을 구현해보도록 하겠습니다!

 

감사합니다.

Comments