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 오브젝트에 저장한 해당 노드의 정보를 삭제하고, 접속한 모든 노드에 최신 상태의 정보를 전파합니다(➌).