본문 바로가기
IT기술(코딩)/nodejs

코틀린 stompclient.kt 에 호환되는 nodejs websocket server code 가장 최신 stomp 라이브러리 git https://github.com/bishoybasily/stomp 에서 제공되는 포멧에수정 하여 사용 중

by 크리에이트매이커 2023. 6. 18.
반응형
const StompServer = require('stompjs');
const WebSocket = require('ws');
var request = require('request');


module.exports = server => {
    //? express 서버와 웹소켓 서버를 연결 시킨다.
    // 변수이름은 wss(web socket server)
    const wss = new WebSocket.Server({ server });
    //* 프론트에서 new WebSocket("ws://localhost:8005") 보냈을때, 웹소켓 연결 실행

    wss.on('connection', (ws, req) => {
        let destination_sub;
        let destination_pub;
        let id;
        let json;
        let flag;
       


        //stomp 연결

        //* ip 파악
        // req.headers['x-forwarded-for'] : 프록시 서버를 경유할때 ip가 변조될수 있다. 이를 감지하고 본ip파악해줄 수 있다.
        const ip = req.headers['x-forwarded-for'] || req.socket.remoteAddress;
        console.log('새로운 클라이언트 접속 ip : ', ip);
        ws.send('CONNECTED\nID:open\nDESTINATION:/sub/chat/room\nACK:auto\nhello\0');
   
        if (ws.readyState === ws.OPEN) {
            ws.send('MESSAGE\nDESTINATION:check\nconnecting');
        } else {
            ws.send('MESSAGE\nDESTINATION:check\nconnecting end');
        }
        //* 클라이언트로부터 온 메시지
        ws.on('message', message => {


            let data = message.toString();
            console.log(data);
            let datasplit = data.split('{');
            let jsonfirst = datasplit[1];
            jsonfirst = '{' + jsonfirst;

            let subscribemsg = message.toString();
            let check_sub = subscribemsg.split('\n');
            if (check_sub[0] == "SUBSCRIBE") {
                flag = 1;
                destination_sub = check_sub[1].split(':');
                destination_sub = destination_sub[1];
                id = check_sub[3].split(':');
                id = id[1];

            } else if (check_sub[0] == "SEND") {
                destination_pub = check_sub[1].split(':');
                destination_pub = destination_pub[1];

            }

            if (jsonfirst != '{undefined') {
                let jsoncontent = datasplit[1].split('}');
                json = '{' + jsoncontent[0] + '}'
                json = JSON.parse(json);
                //postchatdata(json.groupSeq, json.userSeq, json.chatContent, json.chatImgUrl);
                var jsonDataObj = { "groupSeq": json.groupSeq, "userSeq": json.userSeq, "chatContent": json.chatContent, "chatImgUrl": json.chatImgUrl, "sender": json.sender, "userImg": json.uerImg, "createTime": json.createdTime };
                request.post({
                    headers: { 'content-type': 'application/json' },
                    url: '주소입력',
                    body: jsonDataObj,
                    json: true
                }, function (error, response, body) {


                });

         
                sendToAllClients('MESSAGE\nDESTINATION : '+ destination_sub +'\n{ "groupSeq": "' + json.groupSeq + '", "userSeq":"' + json.userSeq + '", "chatContent":"' + json.chatContent + '", "chatImgUrl":"' + json.chatImgUrl + '", "sender":"' + json.sender + '", "userImg":"' + json.userImg + '", "createdTime":"' + json.createdTime + '"}');
               
               
               
     
               
            }





        });


  
        ws.on('error', error => {
            console.error(error);
        });

 
        ws.on('close', () => {
            console.log('클라이언트 접속 해제', ip);
            clearInterval(ws.interval); 
        });

   
        ws.interval = setInterval(() => {
 
            if (ws.readyState !== ws.OPEN) {
                ws.send('MESSAGE\nDESTINATION:' + destination + '\nid:' + id + '\nconnecting');
                return;
            }

        }, 3000);
    });

    function sendToAllClients(message) {
        wss.clients.forEach((client) => {
          if (client.readyState === WebSocket.OPEN) {
            client.send(message);
          }
        });
      }
};




질문은 댓글로 달아주세용.

반응형