-
Socket.io를 이용한 채팅 서버 구축Today I Learned 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()으로 사용한다.
소켓 공간 구성도 구현 방법
1npm install socket.ionpm을 이용해서 설치할 수 있다. 소스 코드는 다음과 같다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters/* 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
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
'Today I Learned' 카테고리의 다른 글
moment (0) 2019.12.29 kill port (0) 2019.12.29 MYSQL JOIN문 (0) 2019.12.27 .gitignore 재설정 (0) 2019.12.26 Node.js를 이용한 회원가입 기능 구현 (0) 2019.12.25