본문 바로가기
node.js

socket.io 사용 방법

by 루에 2022. 3. 14.
반응형

제어권 관리를 위해 소켓 통신 도입을 검토하였다. 일반적인 사용 용도는 아닐 듯 하지만... 이 포스트에서는 socket io의 개념적인 부분보다는 사용 방법 및 기능에 대해 서술하면서 도입을 할만한 가치가 있는지 검증한다.

 

각각 서버와 클라이언트에 다른 node module을 설치한다.

// 서버
npm install socket.io
// 클라이언트
npm install socket.io-client

 

각각 서버와 클라이언트에 아래와 같은 코드를 작성한다.

 

서버

const app = require("express")();
const http = require("http");
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);

// 미들웨어도 지원함(optional)
io.use((socket, next) => {
	console.log(socket);
    next();
});
// 까지

io.on("connection", socket => {
	// 소켓이 연결되면 실행할 코드
    socket.on("disconnect", () => {
    	// 예약된 이벤트. 연결이 종료되면
        console.log("연결 끊김");
    });
    socket.on("메세지이벤트식별자", (args) => {
    	// 구분자 문자열이 일종의 식별자로 사용된다.
    	console.log(args);
    });
});

클라이언트

import { io } from "socket.io-client";

const socket = io("ws://localhost:3000");	// server 주소
// 설정이 필요하면
// const socket = io("ws://localhost:3000", { 설정명 : 설정값 });
socket.connect();
socket.on("connection", () => {
	// 연결되면
});
socket.on("메세지이벤트식별자", args => {
	console.log(args);
});

// 메세지 서버로 보낼 때
// 전송 버튼 등에 이벤트로 걸면 될 듯
socket.emit("메세지이벤트식별자", "메세지", "메세지");

 

위와 같이 구성하면 기본적인 연결이 가능하다.

 

보내는 방법 종류

전체 전송(나를 포함하여 전체 전송한다)

// 클라이언트에 아래와 같이 되어있을 때
socket.on("구분자", () => {});

// 서버에서 아래와 같이 보내면 전체 메세지 전송
io.emit("구분자", "메세지");

 

네임스페이스 전송

네임스페이스를 따로 구성하여 해당 네임스페이스 구성원들에게로 보냄

몇가지 설정 필요

// 서버 설정
const myspace = io.of("/myspace");
myspace.on("이벤트구분자", () => {});

// 클라이언트가 네임스페이스로 붙어야됨
io.connect("주소/myspace", { 설정명 : 설정값 });

// 위처럼 구성 후,

// 클라이언트에 아래와 같이 되어있을 때
socket.on("구분자", () => {});

// 서버에서 아래와 같이 보내면 전체 메세지 전송
io.of("네임스페이스").emit("이벤트구분자", "메세지");

 

나를 제외한 전체

나를 제외한 전체 연결된 곳에 보냄. 보내는 나는 처리가 필요없거나 따로 처리해야할 때 사용

socket안에 있는 broadcast를 사용

socket.broadcast.emit("이벤트구분자", "메세지");

 

특정하여 보냄

소켓아이디를 이용해 특정 누군가에게 메세지 보냄

자신의 소켓아이디는 socket.id 로 확인

io.to("소켓아이디").emit("이벤트구분자", "메세지");

 

특정 그룹에게 보냄

특정 그룹으로 가입시켜 그룹을 형성하여 해당 그룹에게만 보낼 수 있음

socket.join("방의 아이디");	// 그룹 가입
socket.leave("방의 아이디");	// 그룹 탈퇴

// 그룹에 보낼 때
io.to("방의 아이디").emit("이벤트구분자", "메세지");	// 그룹 전체

socket.broadcast.to("방의 아이디").emit("이벤트구분자", "메세지");	// 나를 제외한 그룹 구성원 전체

 

그룹의 목록과 그룹 안의 소켓들을 확인하는 방법

io.adapter.rooms
io.of(네임스페이스).adapter.rooms
socket.adapter.rooms

 

서버쪽 socket.io의 기능

  • 메세지를 모두에게 보내거나 특정 아이디 혹은 그룹에게, 특정 그룹을 제외하고 보내는 기능
  • 그룹에 가입 시키거나 탈퇴 시키는 기능
  • 여러 상태에 대한 콜백 기능(연결 시, 패킷 왔다갔다할 때, 에러 발생, 닫을 때)
  • 클라이언트를 연결 종료 시키는 기능
  • 메세지를 압축하는 기능
  • 메세지에 타임아웃을 설정하는 기능
  • 미들웨어 기능

클라이언트쪽 socket.io-client에서 설정한 소켓은 위 서버쪽 기능에서 메세지를 보내거나 받을 때 사용하는 기능들을 담고 있고, 콜백이나 그룹 관련 기능이 제외되어 있다.

 

 

참조 : https://www.zerocho.com/category/NodeJS/post/57edfcf481d46f0015d3f0cd

반응형

댓글