본문 바로가기

카테고리 없음

NodeJS Websocket (npm install socket.io)

 

 

 

 

npm install socket.io

 

 

 

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

 

 

 

express로 사용한  app.listen을 http.listen으로 변경한다.

http.listen(process.env.PORT, function() {
    
    console.log('listen on' + process.env.PORT);

});

 

 

db를 app.db로 담기

const mogoClient = require('mongodb').MongoClient;

var db; 

mogoClient.connect(process.env.DB_URL,function(err,client){
    if(err){
        return console.log(err)
    }

    db = client.db('TodoApp');
    app.db = db;

});

 

socket.io 4.5.4버전에 해당하는 jquery cdn을 써야 한다

https://socket.io/docs/v4/client-installation/

 

Client Installation | Socket.IO

Version compatibility

socket.io

 

script cdn 사용

 

 

socket .ejs

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>socketejs</title>
        <link
            href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
            crossorigin="anonymous">
    </head>
    <body>
        
        <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
        <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.4/socket.io.min.js"></script> -->
        <script src="https://cdn.socket.io/4.5.4/socket.io.min.js" integrity="sha384-/KNQL8Nu5gCHLqwqfQjA689Hhoqgi2S84SNUxC3roTe4EhJ9AfLkp8QiQcU8AMzI" crossorigin="anonymous"></script>
        <%- include('nav.html') %>
        <h1 class="ml-2 my-3 text-center">채팅방</h1>
        
        <script>
            let socket = io(); 
        </script>
    </body>
</html>

 

 

 

MongoDBWebserver.js

//socket
app.get('/socket', function (req , res) {
                
    res.render('socket.ejs');

})

io.on('connection', function () {
    console.log('유저접속됨');
})

 

 

http://localhost:8080/socket

 

 

 

에코서버 다대다 통신

MongoDBWebserver.js

io.on('connection', function (socket) {
    console.log('유저접속됨');
    socket.on('user-send', function(data){
        console.log(data);
        io.emit('broadcast', data); //에코 서버,    다대다통신
        //io.to(socket.id).emit('broadcast',data);  // 1대1 통신
    })
})

 

socket.ejs

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>socketejs</title>
        <link
            href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
            crossorigin="anonymous">
    </head>
    <body>
        
        <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
        <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.4/socket.io.min.js"></script> -->
        <script src="https://cdn.socket.io/4.5.4/socket.io.min.js" integrity="sha384-/KNQL8Nu5gCHLqwqfQjA689Hhoqgi2S84SNUxC3roTe4EhJ9AfLkp8QiQcU8AMzI" crossorigin="anonymous"></script>
        <%- include('nav.html') %>
        <h1 class="ml-2 my-3 text-center">채팅방</h1>

        <textarea class="container mt-4" id="rcv"  rows="10"></textarea> <p></p>

        <input id="msg"/>
        <button id="send">서버에 메세지 보내기</button>
        <script>
            let socket = io(); 
            $('#send').click(function(){

                socket.emit('user-send', $('#msg').val()); //input에 있는 msg id값 가져오기

            })

            socket.on('broadcast',function(data){

                $('#rcv').append(data + '\n');
              })
        </script>
    </body>
</html>

 

클라이언트

 

 

서버

 

 

 

 

 

 

 

에코서버 1대1통신

MongoDBWebserver.js  io.to(socket.id) 기능 사용

io.on('connection', function (socket) {
    console.log('유저접속됨');
    socket.on('user-send', function(data){
        console.log(data);
        //io.emit('broadcast', data); //에코 서버,    다대다통신
        io.to(socket.id).emit('broadcast',data);  // 1대1 통신
    })
})

클라이언트

 

서버

 

 

 

 

그룹 통신 만들기 (클라이언트)

socket.ejs button room1(진입) 과  room1-send(룸1에서 메세지 보내)를 만듬

<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>socketejs</title>
        <link
            href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
            rel="stylesheet"
            integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
            crossorigin="anonymous">
    </head>
    <body>
        
        <script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
        <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.4/socket.io.min.js"></script> -->
        <script src="https://cdn.socket.io/4.5.4/socket.io.min.js" integrity="sha384-/KNQL8Nu5gCHLqwqfQjA689Hhoqgi2S84SNUxC3roTe4EhJ9AfLkp8QiQcU8AMzI" crossorigin="anonymous"></script>
        <%- include('nav.html') %>
        <h1 class="ml-2 my-3 text-center">채팅방</h1>

        <textarea class="container mt-4" id="rcv"  rows="10"></textarea> <p></p>

        <input id="msg"/>
        <button id="send">서버에 메세지 보내기</button>
        <button id="room1">채팅방1 입장</button>
        <button id="room1-send">채팅방1에서 메세지 보내기</button>
        <script>
            let socket = io(); 

            $('#room1-send').click(function(){
                //채팅방 1에 입장
                socket.emit('room1-send', $('#msg').val());
            })

            $('#room1').click(function(){
                //채팅방 1에 입장
                socket.emit('joinroom', '채팅방 입장 시켜줘');
            })

            $('#send').click(function(){
                //버튼 클릭시 수행
                //socket.emit('user-send', '안녕하세요'); //정적
                socket.emit('user-send', $('#msg').val()); //input에 있는 msg id값 가져오기

            })

            socket.on('broadcast',function(data){
                //console.log(data);
                $('#rcv').append(data + '\n');
              })
        </script>
    </body>
</html>

 

 

그룹 통신 만들기 (서버)

MongoDBWebserver.js

io.on('connection', function (socket) {
    console.log('유저접속됨');
    
    socket.on('room1-send', function(data){
        io.to('room1').emit('broadcast',data);
    })

    //채팅방은 서버에서 관리
    socket.on('joinroom', function(data){
        console.log(data);
        socket.join('room1');
    })
    
    
    socket.on('user-send', function(data){
        console.log(data);
        io.emit('broadcast', data); //에코 서버,    다대다통신
        //io.to(socket.id).emit('broadcast',data);  // 1대1 통신
    })
})

 

 

테스트(클라이언트)

왼쪽 채팅방1 입장 클릭

 

왼쪽 채팅방 입장후 ㅋㅋㅋ 보내기

 

오른쪽 채팅방1 입장 입장 및 왼쪽에 메세지 보내기(같은 room1에 진입됨)

 

오른쪽 채팅방1 입장 입장 및 오른쪽에서 메세지 보내기

 

 

서버 로그