728x90


웹 양방향 통신 기법들이 여러가지가 있다.

그 중에서 정규적인 방법은 바로 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에서 받는걸 알 수 있다.


+ Recent posts