티스토리 뷰

SSE와 WebSocket의 차이점

  • SSE: 서버 -> 사용자 - 일방적 통신
  • WebSocket: 서버 <-> 사용자 - 양방향 통신

 

 

1. socket.io 설치

npm install socket.io

 

2. socket.io 설정

<server.js>

const http = require('http').createServer(app);
const { Server } = require('socket.io');
const io = new Server(http);

 app.listen -> http.listen으로 변경

 // app.listen -> http.listen으로 변경
http.listen(process.env.PORT, function () {
    // listen(서버 띄울 포트번호, 띄운 후 실행할 코드)
});

 

여기까지 하면 WebSocket 오픈 가능 하지만, 사용자가 보는 html파일에도 socket.io 설정을 해야함

 

3.socket io cdn 설정

socket io cdn 검색 > https://cdnjs.com/libraries/socket.io

스크립트 복사해서 html파일에 붙여넣기

❗ 서버에 설치한 socket 버전과 동일한 것으로 복사해야함 ( package.json에서 버전 확인 가능)

 

<socket.ejs>

<body>
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.1/socket.io.js"></script>
    <h4 class="ml-2 my-3 text-center">채팅방</h4>
    <script>
        var socket = io();
    </script>
</body>

 

4. 버튼 클릭 시 메시지 보내기

서버 -> 웹소켓 실시간 메시지 전송

socket.emit(작명, 메시지)

 

<socket.ejs>

<div class="input-group mt-3">
	<div class="content"></div>
    <input class="form-control" id="input" />
    <button class="btn btn-outline-secondary" id="send">서버에 메시지 보내기</button>
</div>
 <script>
    var socket = io();
    $('#send').click(function () {
        socket.emit('user-send', $('#input').val()); // 서버 -> 웹소켓 실시간 메시지 보내는법: socket.emit(작명, 메시지)
    });
    socket.on('broadcast', function (data) {
        console.log(data);
        $('.content').append('<span>' + data + '</span>');
    });
</script>

 

5. 서버에서 해당 메시지 수신하기

socket.on(작명, 콜백함수)

<server.js>

// 누군가 웹소켓에 접속하면 여기 내부 코드를 실행
io.on('connection', function (socket) {
    console.log('사용자가 접속함');
    socket.on('user-send', function (data) { // <--
        console.log(data);
    });
});

 

6. 서버에서 사용자에게 메시지 전송하기

io.emit() // 모든 사용자에게 메시지를 보내줌 == brodcast

<server.js>

io.on('connection', function (socket) {
    console.log('사용자가 접속함');
    socket.on('user-send', function (data) {
        // 서버 -> 사용자 메시지 전송 io.emit() - 모든 사용자에게 메시지를 보내줌 == broadcast
        io.emit('broadcast', data); // <--
        console.log(data);
    });
});

 

+ 단체 채팅말고 1:1 개인 채팅 만들기

 // 개인 채팅 - socket.id가 일치하는 사람한테만 메시지를 보내줌
io.to(socket.id).emit('broadcast', data);

 

7. 채팅방 개설 및 입장

<socket.ejs>

 <button id="room1">채팅방1 입장</button>
 <script>
    var socket = io();
    $('#room1').click(function () {
        socket.emit('join-room', '채팅방입장시켜줘');
    });
 </script>

 

<server.js>

socket.join(방이름)
socket.on('join-room', function (data) {
    socket.join('room1');
});
// 누군가 웹소켓에 접속하면 여기 내부 코드를 실행
io.on('connection', function (socket) {
    console.log('사용자가 접속함');

    // 채팅방 개설 및 입장 socket.join(방이름)
    socket.on('join-room', function (data) { // <--
        socket.join('room1');
    });

    // 서버가 수신하려면 socket.on(작명, 콜백함수)
    socket.on('user-send', function (data) {
        io.emit('broadcast', data);
    });
});

 

8. 입장한 채팅방에서 메시지 보내기

 

<socket.ejs>

<button id="room1-send">채팅방1에서 메시지 보내기</button>
<script>
    var socket = io();
    $('#room1-send').click(function () {
        socket.emit('room1-send', '채팅방1에 입장함');
    });
</script>

 

<server.js>

socket.on('room1-send', function (data) {
    socket.to('room1').emit('broadcast', data);
});
io.on('connection', function (socket) {
    console.log('사용자가 접속함');

    // 채팅방 개설 및 입장 socket.join(방이름)
    socket.on('join-room', function (data) {
        socket.join('room1');
    });

    // 입장한 채팅방에서 메시지 전송
    socket.on('room1-send', function (data) {
        socket.to('room1').emit('broadcast', data);
    });

    // 서버가 수신하려면 socket.on(작명, 콜백함수)
    socket.on('user-send', function (data) {
        io.emit('broadcast', data);

    });
});
댓글