TypeScript で TCP サーバーを実装する

キーエンスハンディターミナル(BT-Wシリーズ)で、照合結果を受け取ったり、結果をハンディ(クライアント)に返すサーバー機能が必要だったので、TypeScript で実装してみました。

その中で、キープアライブパケットを受け取り、クライアントへ応答するサーバープログラムのソースを紹介します。

TCPサーバー(main.ts)

    // main.ts
    import * as net from "net"
    import {ProtocolClass} from "./protocol"
    import {LoggingClass} from "./logger"
    /**
     * サーバープロトコル定義クラス
     */
    const Protocol = new ProtocolClass()
    /**
     * ログ出力クラス
     */
    const Logging = new LoggingClass()
    /**
     * サーバー待ち受けポート番号
     */
    const ListeningPort:number = 2001;
    Logging.Logging(Server Initialized)
    var server = net.createServer(function(conn){
      Logging.Logging(----------)
      Logging.Logging(Connection Established from ${conn.remoteAddress} : ${conn.remotePort});
      conn.on('data', function(data:Buffer){
        Logging.Logging(Received : ${data} from ${conn.remoteAddress} : ${conn.remotePort});
        var SendMessage = Protocol.ReceivedMessageParse(data.toString());
        var buff = Buffer.from(SendMessage, 'utf8');
        Logging.Logging(Send : ${buff.toString()} to ${conn.remoteAddress} : ${conn.remotePort})
        //conn.write(server -> Repeating: ${data})
        conn.write(${(buff).toString()})
      });
      conn.on('close', function(){
        Logging.Logging(Connection closed by client ${conn.remoteAddress} : ${conn.remotePort});
        Logging.Logging(----------)
      });
    }).listen(ListeningPort);
    Logging.Logging(listening on port ${ListeningPort});
  • Nodeの net API を使用します。公式ドキュメントはこちらです。

https://nodejs.org/api/net.html

  • ProtocolClass は、クライアントからのリクエストを受け取って、処理を行うクラスです。

  • LoggingClassは、log4jsを使ってログをファイルに出力するクラスです。ブログ記事はこちら。

Typescriptでlog4jsを使ってログ出力処理を簡単に実装する方法

  • net.createServer(callback).listen(ListeningPort)でTCPの待受を行います。

  • conn.on(“data”, callback) は、クライアントからデータを受け取ったときに実行されます。

  • conn.on(“close”, callback)は、クライアントから接続が切断されたときに実行されます。

Protocol制御クラス(Protocol.ts)

    import {LoggingClass} from "./logger"
    let Logging = new LoggingClass()
    export interface IReceivedMessageParse{
      ReceivedMessageParse(ReceivedMessage:string): string
      KPAL(ReceivedMessage:string):string
    }
    export class ProtocolClass implements IReceivedMessageParse{
      ReceivedMessageParse(ReceivedMessage:string){
        Logging.Logging(ReceivedMessage);
        switch (ReceivedMessage.slice(0,4)) {
            case 'KPAL':
                return(this.KPAL(ReceivedMessage));
            default:
                Logging.Logging(Invalid Command)
                return(0500);
        }
      }
      /**
       ### KPAL(Keep Alive:キープアライブ)
       - e.g. KPAL
       * @param ReceivedMessage クライアント受信文字列
       * @returns クライアント送信文字列(処理ステータス)
       1. 0200 正常終了
       - e.g. 0200
       */
      KPAL(ReceivedMessage:string){
        Logging.Logging(KPAL(Keep Alive) Received);
        return 0200
      }
    }

クライアントから KPAL という文字を受け取ると、 0200 をクライアントへ応答します。よくあるキープアライブのようなものを実装してみました。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

実践TypeScript【電子書籍】[ 吉井健文 ]
価格:3726円 (2019/7/23時点)

[

楽天で購入

](https://hb.afl.rakuten.co.jp/hgc/18648e8b.7d833591.18648e8c.ed1bab3c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F5456816fd8833397a6aa8b80647873ad%2F%3Fscid%3Daf_pc_bbtn&m=http%3A%2F%2Fm.rakuten.co.jp%2Frakutenkobo-ebooks%2Fi%2F18341447%2F%3Fscid%3Daf_pc_bbtn&link_type=picttext&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxfQ==)

コメント

タイトルとURLをコピーしました