메시지 브릿지

매뉴얼 [웹] 1.4.0 기능 패치로 변경된 엔진 소스

페이지 정보

본문

<script>
/* -------------------------------------------
    기본 변수
    - domain : 현재 접속한 사이트 주소
    - MB_ID  : 로그인 아이디
    - USER_IP: 사용자 IP
    - myKey  : 아이디가 있으면 아이디, 없으면 IP 사용
------------------------------------------- */
const domain = window.location.hostname;
const MB_ID = "아이디";
const USER_IP = "ip주소(해당 언어 참고)";
const myKey = MB_ID || USER_IP;

let ws;                     // 웹소켓 연결을 담는 변수 (빈 상자)
let activeUsers = new Map(); 
let userListString = "";

/* -------------------------------------------
    WebSocket 서버 연결 경로 설정
    ★ 아주 중요 ★
    아래 주소는 "실제로 서버로 들어가는 통로(문)" 입니다.
    - wss:// → https처럼 보안 통신
    - designonex.com:14147 → 서버가 대기하는 장소(문 번호)
    - ?group=사이트주소 → 서버가 어느 그룹(방)에 넣을지 구분하는 정보
------------------------------------------- */
const WS_URL = 'wss://designonex.com:14147/?group=' + encodeURIComponent(domain);

let reconnectTimer = null;       // 자동 재접속 타이머
let retryDelay = 1000;           // 재접속 대기 시간 (1초 시작)
const maxDelay = 10000;          // 재접속 최대 대기 시간 (10초)

/* -------------------------------------------
    WebSocket 연결 시작
    - 서버와 연결을 만들어주는 함수
    - 연결 성공/메시지수신/오류/닫힘을 모두 처리함
------------------------------------------- */
function connectWebSocket() {
    console.log("%c[WS] Connecting...", "color: cyan");

    ws = new WebSocket(WS_URL);   // ★ 여기에서 서버 "문"을 실제로 연다!

    /* 연결 성공 */
    ws.onopen = () => {
        console.log("%c[WS] Connected", "color: lime");

        retryDelay = 1000;  // 재접속 딜레이 초기화

        // 서버에 "나 접속했어요" 메시지 보내기
        sendEvent({type: "join", mb_id: MB_ID, ip: USER_IP});
    };

    /* 서버에서 메시지를 보냈을 때 */
    ws.onmessage = (event) => {
        let data;
        try { 
            data = JSON.parse(event.data); 
        } catch {
            return;
        }

        console.log("[WS] Recv:", data);

        /* 사이트 처음 열었을 때 전체 접속자 목록 받기 */
        if (data.type === "init") {
            activeUsers.clear();
            for (const u of data.users) {
                const key = u.mb_id || u.ip || Math.random();
                activeUsers.set(key, u);
            }
        }
        /* 새로운 접속 또는 사용자 정보 변경 */
        else if (data.type === "join" || data.type === "update") {
            const key = data.mb_id || data.ip || Math.random();
            activeUsers.set(key, data);
        }
        /* 접속 종료 */
        else if (data.type === "leave") {
            const key = data.mb_id || data.ip;
            activeUsers.delete(key);
        }

        rebuildUserString();

        if (typeof updateDisplay === "function") {
            updateDisplay(activeUsers, data);
        }
    };

    /* 오류 */
    ws.onerror = () => {
        console.warn("%c[WS] ERROR", "color: red");
    };

    /* 연결이 끊어졌을 때 → 자동 재접속 예약 */
    ws.onclose = () => {
        console.warn("%c[WS] CLOSED", "color: orange");
        scheduleReconnect();
    };
}

/* -------------------------------------------
    자동 재접속 스케줄러
------------------------------------------- */
function scheduleReconnect() {
    if (reconnectTimer) return;

    console.log(
        `%c[WS] Reconnecting in ${retryDelay / 1000}s`,
        "color: yellow"
    );

    reconnectTimer = setTimeout(() => {
        reconnectTimer = null;
        retryDelay = Math.min(maxDelay, retryDelay + 1000);
        connectWebSocket();
    }, retryDelay);
}

/* -------------------------------------------
    인터넷이 다시 연결되면 즉시 재접속
------------------------------------------- */
window.addEventListener("online", () => {
    console.log("%c[WS] ONLINE → immediate reconnect", "color: #4FC3F7");

    if (!ws || ws.readyState !== WebSocket.OPEN) {
        retryDelay = 1000;
        connectWebSocket();
    }
});

/* -------------------------------------------
    탭/창이 다시 활성화되면 즉시 재접속
------------------------------------------- */
document.addEventListener("visibilitychange", () => {
    if (document.visibilityState === "visible") {
        console.log("%c[WS] TAB ACTIVE", "color: #FFD740");

        if (!ws || ws.readyState !== WebSocket.OPEN) {
            connectWebSocket();
        }
    }
});

/* -------------------------------------------
    서버에 메시지 보내기
------------------------------------------- */
function sendEvent(jsonData) {
    if (ws && ws.readyState === WebSocket.OPEN) {
        ws.send(JSON.stringify(jsonData));
    }
}

/* -------------------------------------------
    페이지 종료 시 안전하게 퇴장 알림
------------------------------------------- */
function gracefulDisconnect() {
    const leaveData = {type: "leave", mb_id: MB_ID, ip: USER_IP};

    // 1) WebSocket으로 퇴장 알림
    if (ws && ws.readyState === WebSocket.OPEN) {
        try {
            ws.send(JSON.stringify(leaveData));
            ws.close();
        } catch(e) {}
    }

    // 2) 페이지가 닫혀도 전송 가능한 sendBeacon
    try {
        const blob = new Blob([JSON.stringify(leaveData)], {type: "application/json"});
        navigator.sendBeacon("/ws-leave", blob);
    } catch(e) {}
}

/* -------------------------------------------
    페이지 종료 관련 이벤트 처리
------------------------------------------- */
window.addEventListener("beforeunload", gracefulDisconnect);
window.addEventListener("pagehide", gracefulDisconnect);
document.addEventListener("visibilitychange", () => {
    if (document.visibilityState === "hidden") {
        gracefulDisconnect();
    }
});

/* -------------------------------------------
    접속자 문자열 생성
------------------------------------------- */
function rebuildUserString() {
    userListString = Array.from(activeUsers.values())
        .map(u => u.mb_id || u.ip)
        .join(" | ");
}

/* -------------------------------------------
    페이지가 로드되면 바로 서버에 연결
------------------------------------------- */
connectWebSocket();

</script>

 

댓글목록

등록된 댓글이 없습니다.

메시지 브릿지

Total 19건 1 페이지
  • RSS

메시지 브릿지는 무료 서비스입니다.

안녕하세요. 디자인원엑스(Designonex) 입니다.저희 메시지 브릿지(Message Bridge) 서비스는누구나 자유롭게 사용할 수 있는 무료 실시간 통신 플랫폼입니다.웹사이트나 커뮤니티, 그리고 프로젝트 환경 내에서사용자 간 메시지 전달, 알림, 접속 상태 공유 등다양한 기능을 보다 쉽게 구현할..

작성자: 관리자 댓글 0 조회 984

메시지 브릿지(Message Bridge) 설명

메시지 브릿지(Message Bridge) 서버와 클라이언트를 가장 빠르고 안정적으로 연결하는 실시간 메시지 중계 서버   메시지 브릿지(Message Bridge)는 초경량·초고속 WebSocket 기반의 실시간 메시지 중계 시스템입니다. 간단히 연결만 하면, 서로 다른 기기·웹사이..

작성자: 관리자 댓글 0 조회 1333

메시지 브릿지 1.4.0 기능 패치

클라이언트 개발자님께 힘이 되고자 다음의 기능을 추가했습니다. 감사합니다.1) 유령 처리 방식 개선 (삼세판 적용)Ping 실패 1번 = 무시3번 연속 실패할 때만 유령(끊긴 사용자)로 판단해 제거→ 정상적인 모바일 백그라운드/일시적인 끊김은 절대 문제 없음.2) 자동 재접속 안정화클라이언트에서 연결..

작성자: 관리자 댓글 0 조회 49

[웹] 서버에서 받은 소스 설명

updateDisplay() 내 postData의 역할 & 활용 설명updateDisplay() 안에서 만들어지는 postData는서버(WebSocket)에서 받은 메시지를 프론트에서 활용하기 좋은 ‘가공용 데이터 꾸러미’로 만들어둔 것입니다.const postData = { type..

작성자: 관리자 댓글 0 조회 171

[웹] WebSocket 서버 전송 소스 설명

아래 코드는 실시간 알림 게시판에 적용되는 예제 소스입니다.WebSocket 연결 상태를 자동으로 확인하여, 알림 데이터를 서버에 안전하게 전송하는 역할을 합니다.이 코드를 정상적으로 동작시키기 위해서는 반드시 페이지 상단에 WebSocket 엔진 소스(WS 초기화, sendEvent, connect..

작성자: 관리자 댓글 0 조회 178

[웹] 기본 엔진 소스 설명

WebSocket 엔진(상단 핵심 로직) 설명서※ 이 영역은 전체 시스템의 핵심 엔진이므로 가능한 수정 없이 그대로 사용하는 것을 권장합니다.※ 필요한 기능 확장은 하단 UI 영역 또는 별도 함수에서 처리하는 것을 권장합니다.1. 기본 정보 설정const domain = window.location...

작성자: 관리자 댓글 0 조회 173

메시지 브릿지 1.3.1 보안,성능 패치

1) 메인 이벤트 루프의 차단 요인 제거비동기 흐름을 방해하던 일부 연산이 별도 경로로 이관되었습니다.그 결과, 메시지 처리 경로가 불필요하게 정지하거나 응답 지연이 발생하는 사례가 감소했습니다.2) 안정성 확보단시간에 대량 로그가 발생할 때 출력 루프가 굳어버리던 문제를 재구성했습니다.출력 배치, ..

작성자: 관리자 댓글 0 조회 225

메시지 브릿지 1.2.1 보안 패치

1. 대용량 메시지 차단 기능 추가2. 서버 안정성 강화대용량 파일과 동영상 업로드는 별도의 기술 구조를 통해 처리할 계획입니다.

작성자: 관리자 댓글 0 조회 356

메시지 브릿지 1.2.0 기능패치

일회용 보안 토큰(One-Time Token) 기능 추가클라이언트가 서버에 연결할 때 요청할 수 있는 일회용 인증 토큰 기능이 새롭게 추가되었습니다.서버에서 직접 안전한 토큰을 생성하며, 일정 시간 후 자동으로 폐기됩니다.특정 프레임워크나 언어에 종속되지 않아 웹, 앱, 서버 등 모든 환경에서 사용 ..

작성자: 관리자 댓글 0 조회 576

메시지 브릿지 1.1.3 성능패치

메시지 처리 안정성 개선내부 메시지 흐름이 특정 구간에서 지연되지 않도록 구조를 조금 정리했습니다.출력 처리도 병렬적으로 흘러가도록 방향을 바꿔, 전체 루프 부하를 줄이는 방식으로 보완했습니다.전송 지연 클라이언트의 영향 최소화일부 연결에서 응답이 늦어질 때 전체 전송 흐름이 끌려가지 않도록전송 경로..

작성자: 관리자 댓글 0 조회 739

메시지 브릿지 1.1.2 보안패치

안녕하세요, 디자인원엑스입니다.메시지 브릿지(Message Bridge)가 보안 패치 되었습니다.이번 업데이트의 핵심은 서비스 이전 과정에서 발생할 수 있는 잠재적 위험과 불법 접근을 방지하는 기능을 추가한 점입니다.이번 기능 개선으로,서비스 이전 과정에서 발생할 수 있는 무단 접근이나 데이터 손상 ..

작성자: 관리자 댓글 0 조회 736

메시지 브릿지 무료 사용 약관

시행일자: 2025.11.14 본 약관은 디자인원엑스(이하 “회사”)가 제공하는 메시지 브릿지(Message Bridge) 무료 서비스(이하 “서비스”)의 이용과 관련하여 회사와 이용자 간의 권리, 의무 및 책임사항을 규정함을 목적으로 합니다.제1조 (목적)본 약관은 회사가 제공하는 실시간 ..

작성자: 관리자 댓글 0 조회 826

검색


회원수
12,348
활성 게시글(30일)
1,842
커뮤니티에 기여하세요
새 글 작성
© 2025 Designonex. All rights reserved. · 이용약관 · 개인정보 처리방침