더북(TheBook)

Distributor가 서버로 실행될 수 있는 기본 정보를 전달했으니 노드 접속 이벤트를 구현하겠습니다.

코드 6-10 접속 이벤트 처리

예제 파일 : distributor.js

......
    constructor() {
        super("distributor", 9000, ["POST/distributes", "GET/distributes"]);
    }

    onCreate(socket) { // ➊ 노드 접속 이벤트 처리
        console.log("onCreate", socket.remoteAddress, socket.remotePort);
        this.sendInfo(socket);
    }
    
    onClose(socket) {  // ➋ 접속 해제 이벤트 처리
        var key = socket.remoteAddress + ":" + socket.remotePort;
        console.log("onClose", socket.remoteAddress, socket.remotePort);
        delete map[key];
        this.sendInfo();
    }
    write(socket, packet) {
        socket.write(JSON.stringify(packet) + '¶');
    }
    
    sendInfo(socket) { // ➌ 노드에 접속 정보 전파
        var packet = {
            uri: "/distributes",
            method: "GET",
            key: 0,
            params: []
        };
        for (var n in map) {
            packet.params.push(map[n].info);
        }
        if (socket) {
            this.write(socket, packet);
        } else {
            for (var n in map) {
                this.write(map[n].socket, packet);
            }
        }
    }
}

new distributor();

노드가 접속하면 onCreate 함수를 호출합니다(). 접속한 노드의 소켓에 현재 접속 중인 노드들의 정보를 보냅니다. 노드가 접속을 종료하면 onClose 함수를 호출합니다(). 이때 map 오브젝트에 저장한 해당 노드의 정보를 삭제하고, 접속한 모든 노드에 최신 상태의 정보를 전파합니다().

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.