참고:
[NodeJS][SocketIO]SocketIO 기초 사용하기, 단일 통신, server,client-(1)
[NodeJS][SocketIO]SocketIO 멀티 통신, 다중 통신, server,client-(2)
[Web]http통신을 이용한 양방향 통신기법, long polling
[NodeJS][Express][Web][JavaScript]Long Polling으로 웹 채팅구현(http 양방향)
[JSP][Web][Java]Long Polling으로 웹 채팅구현(http 양방향)
웹 양방향 통신 기법들이 여러가지가 있다.
그 중에서 정규적인 방법은 바로 WebSocket으로 요즘엔 여러 브라우저들이 지원중이다.
다만 기기들 중에서는 지원하지 않는 경우도 많다.
https://developer.mozilla.org/ko/docs/WebSockets
이 사이트에서 브라우저가 어디까지 지원하는지 알 수 있다.
요즘은 대부분 지원하므로 그냥 사용하면 되긴하는데 만약에 지원하지 않는것 같다면
그냥 sokcetio사용하는게 더 편하다.
https://www.npmjs.com/package/ws#api-docs
공식 문서는 위를 참조하라.
Server
코드에 쓸데 없는 코드들이 많아서 중요한것만 추려서 설명하겠다.
app.use(express.static(path.join(__dirname, 'node_modules')));
사실 WebSocket이랑은 상관없는데 클라이언트에서 jquery사용하므로 경로를 뚫어준다.
npm install --save ws
npm install --save jquery
웹소켓과 jquery를 설치해준다.
당장은 jquery를 사용하진 않지만 client에서 사용할 예정이다.
var WebSocketServer = require('ws').Server;
일단 WebSocketServer를 사용하기 위해서 require한다.
var wss = new WebSocketServer({port: 3100});
그리고 SocketServer를 열어준다. 포트는 마음대로하자.
wss.on('connection', (ws) => {
ws.on('message', (message) => {
let sendData = {event: 'res', data: null};
message = JSON.parse(message);
switch (message.event) {
case 'open':
console.log("Received: %s", message.event);
break;
case "req":
sendData.data = message.data;
ws.send(JSON.stringify(sendData));
break;
default:
}
});
});
일반적인 WebSocket예제보다 조금 어려운데
그 이유는 WebSocket은 어떠한 이벤트인지 서버쪽에서 알 수 없어서 보통 WebSocket을 써도
어떤 이벤트인지 알려주는 로직을 달게된다.
다만 WebSocket은 문자열로 전송이 되는데 이를 json을 보내도 문자열로 보내야한다. 즉 직렬화(마샬링)해줘야한다.
그래서 넘어온 데이터는 문자열이므로 JSON.parse로 다시 객체화 시킨다.
그리고 event를 겁사해서 해당 이벤트일때 작업을 실행한다.
Client
여기의 코드를 분석해 보자.
var ws = new WebSocket('ws://localhost:3100');
먼저 연결할 웹 소켓을 선언해준다.
WebSocket은 웹에 기본 스펙이 있기 때문에 따로 선언해줄 필요는 없다.
ws.onopen = (event) => {
let sendData = {event: 'open'}
ws.send(JSON.stringify(sendData));
}
열렸을때의 이벤트를 지정한다.
사실 크게 할건 없지만 예제를 위해서 전달해준다.
여기서 우리가 임의로 event를 붙혔는데 WebSocket을 socketio처럼 이벤트로 분리해서 쓰기위한 예제이다.
ws.onmessage = (event) => {
console.log(event.data);
let recData = JSON.parse(event.data);
switch (recData.event) {
case 'res':
$('#chat').val($('#chat').val() + recData.data.comment + '\n');
break;
default:
}
}
이 부분은 서버에서 데이터가 넘어왔을때 채팅창에 글자를 출력하는 예제이다.
여기서 jquery를 사용했기 때문에 아까 npm install jquery를 해준 것이다.
function myOnClick() {
let sendData = {event: 'req', data: {comment: $('#user').val()}};
ws.send(JSON.stringify(sendData));
$('#user').val('');
}
마지막으로 제출 했을때 데이터를 직렬화해서 서버로 보내는 코드이다.
코드를 보면 알겠지만 보낼때는 ws.send를 사용한다는것을 알 수 있고 받을 때는 함수의 파라메터인 event에서 받는걸 알 수 있다.