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 をクライアントへ応答します。よくあるキープアライブのようなものを実装してみました。

返信を残す

メールアドレスが公開されることはありません。