2019-06-10
최근에 Message Queue를 이용하여 받아온 결과를 실시간으로 웹에 뿌려줘야 할 일이 있었다.
그때 사용한 예제를 여기에 남겨 놓는다.

testSocketMq.js 소스
'use strict'

const amqplib = require('amqplib');
const config = require('config')
const socketio = require('socket.io')
const moment = require('moment')

let h_hostname = config.lsport.h_hostname
let h_user_name = config.lsport.h_user_name
let h_password = config.lsport.h_password
let h_queue = config.lsport.h_package_id

const open = amqplib.connect({
	protocol: 'amqp',
	hostname: h_hostname,
	port: 5600,
	username: h_user_name,
	password: h_password,
	heartbeat: 580,
	vhost: 'vhost_a',
})

let io = socketio.listen(6031);
console.log("socketio open port: "+6031)

io.sockets.on('connection', function (socket) {
	console.log('server running at '+6031+' port');
});

open.then(function(conn) {
	return conn.createChannel();
}).then(function(ch) {
		return ch.consume(h_queue, function(msg) {
			// console.log(msg)
			io.emit('new_msg', msg) //받아온 msg를 방출하는 부분
			console.log('----msg emit: '+moment().format('YYYY-MM-DD HH:mm:ss'))
		});
}).catch(console.warn);

웹 페이지 소스
<script src="/socket.io/socket.io.js"></script>

<script>
// 이렇게 선언해야 Access-Control-Allow-Origin' error가 안뜸
var socket = io('http://localhost:6031', { transports : ['websocket'] });

socket.on('new_msg', function (data) {
    console.log(data);
});

socket.emit("this_num", { 'num': 100 }); //서버에 메세지 보내기

socket.on('disconnect', function(reason){
	console.log('disconnected:'+reason) //접속 끊어졌을때 log출력
});

socket.io.on("reconnect", function(){
	console.log('reconnect..') // 자동으로 reconnect 됐을때 event
});
</script>

testSocketMq.js 실행시 화면
$ node testSocketMq
socketio open port: 6031
server running at 6031 port
----msg emit: 2019-06-10 14:29:08
----msg emit: 2019-06-10 14:29:09
----msg emit: 2019-06-10 14:29:12
----msg emit: 2019-06-10 14:29:13
----msg emit: 2019-06-10 14:29:22
----msg emit: 2019-06-10 14:29:24
----msg emit: 2019-06-10 14:29:24
----msg emit: 2019-06-10 14:29:24
----msg emit: 2019-06-10 14:29:24
socket.io가 너무 막강해서, 간단히 소켓통신을 할 수 있고, 이미 메세지를 뿌려주는 MQ가 있을 때문에, 그냥 해당 메세지를 연결해서 뿌려만 주면 되는 상황이다.


//--------------------2022.07.05 추가

socket.io CDN 주소: https://socket.io/docs/v4/client-installation/
<script src="cdnjs: https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.0/socket.io.min.js"></script>
<script src="jsDelivr: https://cdn.jsdelivr.net/npm/socket.io-client@4.5.0/dist/socket.io.min.js"></script>
<script src="unpkg: https://unpkg.com/socket.io-client@4.5.0/dist/socket.io.min.js"></script>