ABOUT ME

Today
Yesterday
Total
  • 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()으로 사용한다.

    소켓 공간 구성도

     

    구현 방법

    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

     

    '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
Designed by Tistory.