반응형
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' },
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);
}
});
}
};
질문은 댓글로 달아주세용.
반응형
'IT기술(코딩) > nodejs' 카테고리의 다른 글
자바스크립트 express multer 다중파일 여러파일 이미지 업로드 할때 한개만 업로듣 되는현상 (0) | 2023.09.23 |
---|---|
multer 사용시에 [Violation] handler took 발생 현상 원인 및 조치 자바스크립트 1. (0) | 2023.08.30 |
multer 응용 및 내부 기능 한계점 극복 formdata사용 (0) | 2023.07.17 |
nodejs multer의 한계점 (1) | 2023.07.17 |
nodejs 8080 포트 80 번포트로 리디렉션하기 (0) | 2023.06.03 |