Tcpノードを使う(その3)

ここのところずっとNode-REDのサンプルを見ながら各ノードの使い方を確認しています。頭出しの記事はこちらをご確認ください。今回はTcpノードの最終回です。前々回の記事では、サーバからクライアントにメッセージを送信しました。前回の記事では、クライアントからサーバにメッセージを送信しました。今回は、クライアントからサーバにメッセージを送信し、そのコネクション上でサーバからクライアントにメッセージを返信します。普通のTCPクライアントとサーバのやり取りをまるっと実装します。

TCPクライアントとサーバ間でメッセージを送受信する

確認するサンプルは、「読み込み > サンプル > flows > node-red > network > tcp > 03 - Send reply to client of TCP connection」です。


上段はサーバに対してリクエストを送信後、サーバからのメッセージの返信を待ち受けるクライアントのフローです。グレーのTcp requestノードを確認すると、以下のように設定されています。
  • サーバ:localhost
  • ポート:1883
  • 戻り値:指定文字の受信時 \n

Injectノードでは「Hello, World!\n」という文字列をpayloadに指定して送信しています。

一方、下段は接続を待ち受けるサーバサイドのフローです。Tcp inノードを確認すると、以下のように設定されています。
  • 種類:待ち受け
  • ポート:1883
  • 出力:ストリーム文字列のペイロード
  • 区切り文字:\n

続いて、Changeノードを確認すると、msg.payloadの値を加工して、先頭に「Received: 」、末尾に改行コードを付加しています。


最後に、Tcp outノードは次のように設定されています。雰囲気的にmsg.payloadの内容をレスポンスとして返すんでしょうね。
  • 種類:TCP応答

Injectノードを実行すると、デバッグパネルに「Received: Hello, World!\n」のログが出力されます。
  1. 上段のフローで「Hello, World!」のメッセージをサーバに送信する
  2. 下段のフローでサーバがメッセージを受信し、メッセージを加工してクライアントに返信する
  3. 上段のフローでサーバが返したメッセージをクライアントで受信してログ出力する
という流れです。


例によって、これでも一応動いてはいますが、Node−RED内で完結してしまっているのでTCPサーバが動いている実感が湧きません。そこで、TelnetクライアントでTCPサーバに接続してメッセージの送受信を行ってみます。

と、その前に、下段のTcp inノードの区切り文字設定を以下のように「\n」に変更しておきます。これはTelnetクライアントを動かすターミナルの改行コード設定と合わせるのが目的です。この設定が合っていないと、TelnetクライアントでEnterキーを押してもメッセージの送受信がうまく行われません。


この状態で、Telnetクライアントから「localhost 1883」に接続して適当な文字列(ここでは「fugo」)を入力してEnterキーを押下します。
$ telnet -a localhost 1883
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
fugo
Received: fugo
サーバから「Received: fugo」と返信が返ってきましたね。

まとめ

ここまで確認したことを一旦まとめます。
  • Tcp requestノードを利用するとメッセージの送信と返信の受信を行うTCPクライアントになります
  • Tcp inノードで「待ち受け」て、Tcp outノードで「TCP応答」を設定すると、クライアントの接続を待ち受けて、何らかの処理後にメッセージを返信するTCPサーバになります
この仕組を拡張すればWebサーバ、SMTPサーバ、FTPサーバなど、TCPベースのサーバは何でも作れそうです(誰もやらないと思いますが)。ということで、以上TCPノードシリーズでした。

コメント

このブログの人気の投稿

Execノードを使う

Joinノードを使う(その4)

SendGridのX-SMTPAPIヘッダの使い方(Section Tags、Substitution Tags編)