キーエンスハンディターミナル(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==)
コメント