socket.io (WebSocket)
웹소켓 (WebSocket)은 웹페이지에서 실시간으로 양방향 통신을 가능하게 해주는 HTML5 프로토콜이다.
웹소켓을 통해 서버로 메세지를 주고 받는 경우 요청없이 데이터를 처리 할 수 있다.
그렇기 때문에 실시간 데이터통신이 필요한 채팅앱이나 기타 어플리케이션 제작에 필요한 프로토콜이다.
https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%86%8C%EC%BC%93
node.js
에서 이러한 WebSocket 기술을 간단하고 강력하게 사용 할 수 있게 도와주는 npm 모듈이 바로 soket.io 이다.
socket.io에서는 2가지가 중요한데 먼저 데이터를 emit(전송)하고 그 후에 또 다른 데이터를 on(전달) 받는 개념으로 통해 양방향 데이터 채널이 구성 된다.
먼저 본격적인 앱 제작전에 HTML 파일 및 css 파일을 처리해 준다. 또한 client 사이드의 컨트롤을 위해 js파일도 생성 해준다.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Chat App</title>
<link rel="stylesheet" href="./style.css" />
</head>
<body>
<div id="message-container"></div>
<form id="send-container">
<input type="text" id="message-input">
<button type="submit" id="send-button">보내기</button>
</form>
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script src="app.js"></script>
</body>
</html>
style.css
body {
padding: 0;
margin: 0;
display: flex;
justify-content: center;
}
#message-container {
width: 80%;
max-width: 1200px;
}
#message-container div {
background-color: #CCC;
padding: 5px;
}
#message-container div:nth-child(2n) {
background-color: #FFF;
}
#send-container {
position: fixed;
padding-bottom: 30px;
bottom: 0;
background-color: white;
max-width: 1200px;
width: 80%;
display: flex;
}
#message-input {
flex-grow: 1;
}
script.js (client side)
// socketApp 초기화
const socketApp = io('http://localhost:3000');
// DOM selecte
const messageContainer = document.getElementById('message-container');
const messageForm = document.getElementById('send-container');
const messageInput = document.getElementById('message-input');
// 처음 접속시에 유저의 이름을 물어본다.
const name = prompt('What is your name?');
addMessage('You joined');
// Server로 데이터를 보낸다.
socketApp.emit('new-user', name);
// Server에서 데이터가 왔을시 (socket.broadcast.emit)
socketApp.on('chat-message', data => {
addMessage(`${data.name}: ${data.message}`);
});
socketApp.on('user-connected', name => {
addMessage(`${name} connected`);
});
socketApp.on('user-disconnected', name => {
addMessage(`${name} disconnected`);
});
// 기본적으로 html 파일에서 데이터를 submit 했을 때
messageForm.addEventListener('submit', e => {
e.preventDefault();
const message = messageInput.value;
addMessage(`You: ${message}`);
// Server로 데이터를 보낸다.
socketApp.emit('send-chat-message', message);
messageInput.value = '';
});
function addMessage(message) {
const messageElement = document.createElement('div');
messageElement.innerText = message;
messageContainer.append(messageElement);
};
그럼 이제 server쪽을 제작 해보자.
먼저 npm module들을 설치 해준다.
npm init -y
npm i soket.io
npm i nodemon --save-dev
그 다음에 server쪽 script를 작성한다.
// socket을 import 하고 3000 port 사용 명시
const socketApp = require('socket.io')(3000);
const users = {};
// socketApp을 초기화 하고 연결 완료시에
socketApp.on('connection', socket => {
// 각각의 event마다 데이터를 처리 할 수 있다.
socket.on('new-user', name => {
users[socket.id] = name;
// client쪽으로 다시 이벤트를 보내준다.
socket.broadcast.emit('user-connected', name);
});
socket.on('send-chat-message', message => {
socket.broadcast.emit('chat-message', { message: message, name: users[socket.id] });
});
socket.on('disconnect', () => {
socket.broadcast.emit('user-disconnected', users[socket.id]);
delete users[socket.id];
});
});
Socket통신은 굳이 실시간 채팅 어플리케이션이 아니더라도 쓸 곳이 많으니 상황에 따라 잘 활용하면 좋을거 같다.
'Node & AWS > Node' 카테고리의 다른 글
eslint, prettier, eslint-config-airbnb #2 (0) | 2022.10.09 |
---|---|
eslint, prettier, eslint-config-airbnb #1 (0) | 2022.10.09 |
JWT (JSON Web Token) (1) | 2022.09.25 |
process.env 환경변수 (environment) (0) | 2022.09.22 |
http module #0 (0) | 2022.01.18 |
댓글
이 글 공유하기
다른 글
-
eslint, prettier, eslint-config-airbnb #2
eslint, prettier, eslint-config-airbnb #2
2022.10.09 -
eslint, prettier, eslint-config-airbnb #1
eslint, prettier, eslint-config-airbnb #1
2022.10.09 -
JWT (JSON Web Token)
JWT (JSON Web Token)
2022.09.25 -
process.env 환경변수 (environment)
process.env 환경변수 (environment)
2022.09.22