Today I Learned

Socket.io를 이용한 채팅 서버 구축

c3epmos 2019. 12. 24. 22:05

socket.io

JavaScript를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현할 수 있도록 한 기술이며 표준 기술이 아니고 Node.js 모듈이다.

socket.io의 응용 범위

그림과 같이, 실시간 분석이나 채팅과 같은 기능들에 사용된다. 

 

socket.io's functions

socket.on(eventName, callback) : 어떤 이벤트가 동작하면 callback 함수를 동작한다.

socket.leave(room[, callback]) : 어떤 방을 떠나고, callback 함수를 동작한다.

socket.to(room).emit(eventName[, …args][, ack]) : 어떤 room에 event를 socket으로 방출하는 함수이다. 다른 파라미터들도 포함될 수 있다. 

socket.of('/namespace') : socket을 '/namespace'로 지정하는 함수이다.

 

namespace와 room

namespace와 room은 소켓 통신 공간을 구별하기 위해 사용한다. 서버 측에서는 of function 을 호출함으로써 custom namespace를 설정할 수 있다. room은 namespace에서 나눠진 socket들을 또 나눌 수 있다. socket.leave(), socket.join()으로 사용한다.

소켓 공간 구성도

 

구현 방법

1
npm install socket.io

npm을 이용해서 설치할 수 있다. 소스 코드는 다음과 같다.

/* socket\room_chat\app.js */
const app = require('express')();
const http = require('http').Server(app);
const io = require('socket.io')(http);
app.set('view engine', 'ejs');
app.set('views', './views');
let room = ['room1', 'room2']; // 사용할 room의 갯수
let a = 0; // room number를 저장할 변수
var nsp = io.of('/my-namespace'); // of 함수로 namespace를 'my-namespace'로 지정한다.
app.get('/', (req, res) => {
res.render('chat'); // get 요청이 들어온 경우, chat.ejs를 렌더링한다.
});
nsp.on('connection', (socket) => { // 클라이언트와 연결이 되자마자 작동한다.
socket.on('disconnect', () => { // 연결을 해제 하자마자 작동한다.
console.log('user disconnected');
});
socket.on('leaveRoom', (num, name) => {
socket.leave(room[num], () => { // 나갈 room을 파라미터로 넘긴다.
console.log(name + ' leave a ' + room[num]);// 'test' leave a room1
nsp.to(room[num]).emit('leaveRoom', num, name); // 'test' leave a room1:(
});
});
socket.on('joinRoom', (num, name) => {
socket.join(room[num], () => { // 들어갈 room을 파라미터로 넘긴다.
console.log(name + ' join a ' + room[num]); // 'test' join a room1
nsp.to(room[num]).emit('joinRoom', num, name); // 'test' joined room1:)
});
});
socket.on('chat message', (num, name, msg) => {
a = num;
nsp.to(room[a]).emit('chat message', name, msg); // room[a]에 chat message를 emit
});
});
http.listen(3000, () => {
console.log('Connect at 3000');
});

위의 코드는 실제 로직을 구현할 index.js 이다.

 

Future work

namespace와 room을 ID처럼 사용해 1 on 1 채팅 구현은 성공했지만, 실제 제공하고 있는 채팅 서비스처럼 DB에 연동해서 실시간으로 채팅을 처리할 필요성이 있다.

출처

https://medium.com/wasd

 

Node.js와 Socket.io를 이용한 채팅 구현 (1)

Socket.io?

medium.com

 

https://socket.io

 

Socket.IO — Server API

ServerExposed by require('socket.io'). new Server(httpServer[, options]) httpServer (http.Server) the server to bind to. options (Object) Works with and without new: const io = require('socke

socket.io

 

댓글수0