Socket이란?
소켓은 네트워크 상에서 돌아가는 두 개의 프로그램 간 양방향 통신을 도와주는 통로 역할
→ 양방향 통신을 도와주는 엔드 포인트(EndPoint)
EndPoint: IP address + port
▶ 모든 TCP 연결은 2개의 엔드 포인트로만 식별 된다
- 소켓은 역할에 따라 클라이언트 소켓, 서버 소켓으로 분리된다.
- 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어 진다.
Server Socket(서버 소켓)
: 서버 프로그램에서 사용하는 소켓으로 클라이언트로부터 요청을 기다리다가 요청이 오면 클라이언트로 요청을 맺는다.
클라이언트 소켓 간 연결을 도와준다.
Client Socket(클라이언트 소켓)
: 클라이언트에서 사용하는 소켓으로 생성하고 서버 프로그램으로 연결 요청을 하고 필요에 따라 데이터를 전송한다.
소켓 통신
소켓을 통해 Server와 Client가 특정 Port를 통해 실시간으로 양방향 통신 하는 방식
→ Streaming 중계나 실시간 채팅, 게임 등과 같이 즉각적으로 정보를 주고받는 경우에 사용
소켓 통신 방법
- Server에서는 Port를 열고 Client의 접속을 기다린다.
- Client는 Server의 IP와 Port에 접속한다. → Server와 Client 연결
- Server와 Client 간의 통신은 Send, Receive의 형태로 주고받는다.
- 그리고 통신이 끝나면 close()로 접속을 끊는다.
Web Socket이란?
WebSocket은 서버와 클라이언트 간에 Socket Connection을 유지해서 언제든 양방향 통신 또는 데이터 전송이 가능하도록 하는 기술
서버와 클라이언트 간의 통신이 대부분 HTTP를 통해 단 방향으로 이루어졌었고 그로 인해 서버 업데이트에 대한 정보가 클라이언트에 제대로 전달되지 않은 경우도 많았다.
그래서 이를 보완하고자 웹에서도 양방향 소통이 가능하게 해주는 WebSocket이 등장하였다.
- HTML 웹 표준 기술
- 매우 빠르게 작동하며 통신할 때 아주 적은 데이터를 이용
- 이벤트를 단순히 듣고 보내는 것만 가능
Socket.io 란?
WebSocket을 기반으로 자바스크립트를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현할 수 있도록 도와주는 라이브러리
- 방(room) 개념을 이용해 일부 클라이언트에게만 데이터를 전송하는 브로드캐스팅이 가능함
서버에서 연결된 소켓(사용자)들을 세밀하게 관리 해야 하는 서비스인 경우에는 Broadcasting 기능이 있는 socket.io을 쓰는게 유지 보수 측면에서 편리
Socket.io의 rooms
소켓이 참가 및 탈퇴할 수 있는 임의의 방으로 클라이언트의 하위 집합에 이벤트를 브로드캐스트하는 데 사용.
Room은 Server만 관리할 수 있다. 즉 서버만 Room의 정보를 알 수 있다.
Client는 단순히 Room에 참가 및 탈퇴만 할 수 있다.
Socket.io 명령어
var app = require('express')();
var server = require('http').createServer(app);
// http server를 socket.io server로 upgrade
var io = require('socket.io')(server);
server.listen(3000, function() {
console.log('Socket IO server listening on port 3000');
});
클라이언트가 전송한 메시지 수신
→ 현재 접속되어 있는 클라이언트로부터의 메시지를 수신하기 위해서는 on 메소드를 사용
socket.on('event_name'), function(data) { ... });
// event_name: 클라이언트가 메시지 송신 시 지정한 이벤트 명
// function: 이벤트 핸들러. 핸들러 함수의 인자로 클라이언트가 송신한 메시지 전달
명령어 | 설명 |
io.on('connection', function(socket) { }); |
클라이언트가 Server의 접속(connect)했을 때 |
클라이언트에게 메시지 송신
명령어 | 설명 |
io.emit(event_name, msg) | 접속된 모든 클라이언트에게 메시지 전송 |
socket.emit(event_name, msg) | 메시지를 전송한 클라이언트에게만 메시지 전송 |
socket.broadcast.emit(event_name, msg) | 메시지를 전송한 클라이언트를 제외한 모든 클라이언트에게 메시지 전송 |
io.to(id).emit(event_name, msg) | 특정 클라이언트에게만 메시지 전송 (id는 socket 객체의 id 속성 값) |
Socke.io Client 명령어
<!-- HTML 설정 -->
<!-- web(chrome)에서 socket.io 사용 -->
<script src="/socket.io/socket.io.js"></script>
<!-- electron에서 socket.io 사용 -->
<script src="./node_modules/socket.io/client-dist/socket.io.js"></script>
/* js 설정 */
// web(chrome)에서 socket.io 서버에 접속
var socket = io();
// electron에서 socket.io 서버에 접속
const socket = io.connect('ws://localhost:3000/');
서버로의 메시지 송신
→ 현재 접속되어 있는 서버로 메시지를 송신하기 위해서는 emit 메소드를 사용
socket.emit("event_name", msg);
// event_name: 이벤트 명
// msg: 송신 메시지
서버로부터 메시지 수신
→ 현재 접속되어 있는 서버로부터 메시지를 수신하기 위해서는 on 메소드를 사용
socket.on("event_name", function(data) { ... });
// event_name: 서버가 메시지 송신시 지정한 이벤트 명
// function: 이벤트 핸들러 핸들러 함수의 인자가 서버가 송신한 메시지(data) 전달
'CoMirror (Smart Mirror)' 카테고리의 다른 글
WebRTC에 대해서 (0) | 2022.08.16 |
---|---|
MariaDB binary log 설정 (0) | 2022.08.02 |
Raspberry Pi에 MySQL 설치 & workbench 연결 (2) | 2022.07.29 |
magic mirror2 설치와 자동 실행 설정 (0) | 2022.07.29 |
Raspberry Pi 원격 사용을 위한 설정 (0) | 2022.07.12 |