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==)

速攻でメモできる QuickNote リリースしました!

QuickNoteは動作が超軽量でサクサクかけるノートアプリです。一瞬の閃きを逃さずにノートを開き書き始めることができます。 アカウント登録も不要です。お試しあれ!

Excel操作をコマンドで! proBoarderExcel

Excelはマウスで操作するのが基本ですが、マウス操作に疲れてはいませんか? キーボードでExcel操作ができるようになるアプリです。オープンソースで無料です。

積み上げ! Daily Stack リリースしました!

Daily Stack は日々の積み上げを管理するToDoアプリです。過去の積み上げの振り返りだけでなく、ツイート機能もあります。 アカウント登録不要ですぐに使い始めることができます。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱