WebSocket client と TCP client の中継ツールを作った

wstcplink を作った。

<https://github.com/ifritJP/wstcplink>

これが何かというと、 WebSocket client と TCP client の中継ツールだ。

次のような感じ。

            ⇔⇔⇔⇔⇔⇔⇔⇔
Webブラウザ → このツール ← tcp クライアント
            ⇔⇔⇔⇔⇔⇔⇔⇔

Web アプリケーションとの双方向通信

Web アプリケーションで双方向通信するには、 web socket を使うのが標準だと思う。 (web socket にも課題はあるが、その辺りはここでは触れない。)

で、その場合 web socket に対応したサーバが必要になる。

一方で、web socket に対応するのが困難な環境もある。 イマドキの環境なら web socket 対応のサーバくらい簡単に対応できる、 と思う人もいるかもだが、「イマドキの環境」じゃない環境はいくらでもある。

そういった web socket への対応は困難な環境でも、 TCP は利用可能だったりする。

TCP がダメなら UART でもなんでも良いが。

ともかく、そういった web socket 対応が困難な環境と、 Web アプリケーションとを双方向通信したい、というのが、 この wstcplink の開発動機だ。

Web アプリケーションから直接 TCP を叩く拡張機能も提案されているようだが、 少なくとも現時点では一般的に使えないし、 個人的には使えるべきではないとも思うので、今回は触れない。

メリット

このツールの特徴として、 Web アプリケーションとの接続対象が、 TCP Server ではなく TCP Client だ、ということが挙げられる。

これの何が特徴かというと、 TCP Client なので主体的に動ける、ということだ。 いつでも好きなタイミングで接続・切断が可能だ。

そして、このツールの1つのポートへのセッションを 1 つに限定し、 そのセッションを維持することで、 Web アプリケーションと、 TCP クライアントとの接続がいつでも再接続できる。

一般的な双方向通信を行なうシステムの開発は、 どちらかを再起動する時はもう片方のネットワークの再接続を行なう必要がある。 しかし、このツールがサーバとして中継してセッションを維持することで、 一方の接続が切れても、もう一方はそのまま接続を維持していることが出来る。

もう少し具体的に言えば、 Web アプリケーション、あるいはその接続先のコードを編集して、 再実行するには通常は両方を再接続しなおさないといけないが、 このツールを挟むことで、一方だけを再接続するだけで良い。

これにより、Web アプリケーションと TCP Client の接続が簡単になり、 開発がスムーズに行なえる。

使い方

このツールは、次のコマンドラインオプションを指定する。

$ wstcplink server <link> [<link>...]

こので server は、サーバモードの起動を指定するオプションだ。

link は、 WebScoket と TCP の listen するポートを指定する。

指定は次のように行なう。

:10000,:10001

ここで、最初の :10000 は websocket のポート番号を指定し、 次の :10001 は tcp のポート番号を指定する。 これによって、 10000 番ポートの websocket アクセスと、 10001 番ポートの tcp アクセスが接続される。

なお、次のように指定することで、 内部からの通信のみを受けつけるように限定できる。

localhost:10000,localhost:10001

まとめると、以下のように指定する。

wstcplink server :10000,:10001

link は次のように複数指定できる。

wstcplink server :10000,:10001 :20000,:20001

サンプル

動作確認用として wstcplink は、 websocket client 機能を持っている。

この機能と telnet コマンドを利用することで、 このツールの動きを確認できる。

  • wstcplink を起動する
$ wstcplink server :10000,:10001
  • websocket client を接続する
$ wstcplink test-wsclient :10000
  • telnet (tcp client) を接続する
$ telnet localhost 10001

これで、 websocket client と、telnet (tcp client) が接続されたので、

websocket client 側で文字を入力すれば telnet 側で表示され、 telnet 側で入力すれば、websocket client 側に表示される。

また、どちらかを切断して再接続すれば、 一方は接続を保ったままセッションが維持されることが分かる。