더북(TheBook)

Server 클래스를 완성했습니다. 전체 코드는 다음과 같습니다.

코드 6-8 Server 클래스 전체 코드

예제 파일 : server.js

'use strict';
const net = require('net');
const tcpClient = require('./client.js');

/* * 서버 클래스 */
class tcpServer{
    constructor(name, port, urls) {
        //서버 상태 정보
        this.context = {
            port: port,
            name: name,
            urls: urls
        }
        this.merge = {};

        // 서버 객체 생성
        this.server = net.createServer((socket) => {    
            // 클라이언트 접속 이벤트
            this.onCreate(socket);

            // 에러 이벤트
            socket.on('error', (exception) => {
                this.onClose(socket);
            });

            // 클라이언트 접속 종료 이벤트
            socket.on('close', () => {
                this.onClose(socket);
            });
           
            // 데이터 수신 이벤트
            socket.on('data', (data) => {
                var key = socket.remoteAddress + ":" + socket.remotePort;
                var sz = this.merge[key] ? this.merge[key] + data.toString() :
                         data.toString();
                var arr = sz.split('¶');
                for (var n in arr) {
                    if (sz.charAt(sz.length - 1) != '¶' && n == arr.length - 1) {
                        this.merge[key] = arr[n];
                        break;
                    } else if (arr[n] == "") {
                        break;
                    } else {
                        this.onRead(socket, JSON.parse(arr[n]));
                    }
                }
            });
        });
         
        // 서버 객체 에러 이벤트
        this.server.on('error', (err) => {
            console.log(err);
        });
     
        // 리슨
        this.server.listen(port, () => {
            console.log('listen', this.server.address());
        });
    }

    onCreate(socket) {
        console.log("onCreate", socket.remoteAddress, socket.remotePort);
    }

    onClose(socket) {
        console.log("onClose", socket.remoteAddress, socket.remotePort);
    }
 
    // Distributor 접속 함수
    connectToDistributor(host, port, onNoti) {       
       
        // Distributor 전달 패킷
        var packet = {
            uri: "/distributes",
            method: "POST",
            key: 0,
            params: this.context
        };
        var isConnectedDistributor = false;

        this.clientDistributor = new tcpClient(
            host
            , port
            , (options) => {                                  // Distributor 접속 이벤트
                isConnectedDistributor = true;                
                this.clientDistributor.write(packet);
            }
            // Distributor 데이터 수신 이벤트
            , (options, data) => { onNoti(data); }
            // Distributor 접속 종료 이벤트
            , (options) => { isConnectedDistributor = false; }
            // Distributor 통신 에러 이벤트
            , (options) => { isConnectedDistributor = false; }
        );

        // 주기적으로 재접속 시도
        setInterval(() => {
            if (isConnectedDistributor != true) {
                this.clientDistributor.connect();
            }
        }, 3000);
    }    
}

module.exports = tcpServer;

기본 클래스를 모두 만들었습니다. 이제 Distributor에서 사용할 프로토콜을 정의하겠습니다.

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