반응형
제어권 관리를 위해 소켓 통신 도입을 검토하였다. 일반적인 사용 용도는 아닐 듯 하지만... 이 포스트에서는 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
반응형
댓글