WebSocket とは、ウェブアプリ上で双方向通信を行うものです。
双方向通信を行う一つのメリットは、
サーバー側の処理を挟めるということです。
通常のウェブサイトであれば、
サーバーからページを拾って来たら、
その後の処理はユーザーの端末上、
ブラウザ上で実行します。
それだと、ブラウザ上で実行できるJavascriptで処理を書かないと。。。
となってしまいますが、サーバーに処理を渡せれば、
基本的にどんな言語で処理を書いてもOKということになります。
どんな言語でもということで、ウェブアプリからかけ離れていそうな R で、
あえて、WebSocket サーバーを作ってみましょう。
より詳しい WebSocket の説明は、下の記事を参照ください。
https://clean-copy-of-onenote.hatenablog.com/entry/inrto_websocketclean-copy-of-onenote.hatenablog.com
httpuv パッケージのインストール
まずは、R で WebSocket サーバーを簡単に立てられる
「httpuv」をインストールしましょう。
install.packages("httpuv")
を R のコンソールで入力します。
R のコード
それでは、WebSocket サーバーを実行してみましょう。
次のコードを実行すると、接続してきたクライアントに、
"hello" という文字列を送る WebSocket サーバーが実行されます。
library(httpuv) app <- list( call = function(req) { }, onWSOpen = function(ws) { ws$send("hello") } ) runServer("0.0.0.0", 9999, app)
runServer
でサーバーが実行され、
サーバーの処理は、app
で指定します。
"0.0.0.0" は任意のIPアドレスからのアクセスを通し、
サーバーのポートは9999に指定しています。
app
の中身は、
call
が HTTP リクエストに対するレスポンス処理で、
onWSOpen
が WebSocket の接続時の処理を表します。
今回は、純粋に WebSocket サーバーとして動かすので、
call
での処理は必要ないのですが、
runServer
で必須なので、空の関数を指定しています。
onWSOpen
では、接続されたソケットに対して、
ws$send
で "hello" という文字列を返しています。
実行手順
上の Rコードを実行すると、
WebSocket サーバーが起動するのですが、
正しく動作しているかを確かめるために、
サーバーへの接続を試みてみます。
0. 準備:wscat のインストール
テスト実行のために、クライアントを作るのも面倒なので、
コマンドラインで簡単に実行できる「wscat」を使うことにします。
wscat は Node.js 環境上で動作するので、
まずは、下のサイトから Node.js のインストーラーをダウンロードして、
Node.js のインストールを行います。
その後、コマンドライン上で、
npm install -g wscat
を実行します。
npm は node.js のパッケージマネージャで、
簡単にパッケージの追加ができるすぐれものです。
1. サーバーを実行する
上のRコードを実行してサーバーを立てます。
runServer
を実行中は、実行が中断されるまで、
R のコンソールで入力を受け付けなくなるので、
実行しているかどうかの目印にしましょう。
2. サーバーに接続してみる
では、wscat で先ほど立てたサーバーに接続してみましょう。
次のコマンドをコマンドラインで実行します。
wscat -c ws://localhost:9999
"-c" オプションはクライアントとしてサーバーに接続しにいくことを表していて、
サーバーのアドレスが続いています。
WebSocket のアドレスは、「ws://」から始まり、
ホスト名(今の場合は、localhost)、
ポート名(今の場合は9999)と続きます。
wscat では、送られてきたメッセージをコマンドラインにそのまま出力してくれるので、
コマンドライン上に "hello" の文字が表示されれば、正しく動作していることが確認できます。
まとめ
WebSocket サーバーをRで作ってみました。
これを使えば、サーバーの諸々の処理をRで書けるので、
ウェブページ上の処理をサーバーに渡して、
R で処理を実行してから、ウェブページに反映するということが可能になります。
Javascript じゃなくて、Rで処理したいという願いも叶いますね。
もちろん、Rじゃなくても、
WebSocket サーバーを立てて、サーバーに処理をもらえば、
サーバーで好きな言語で処理ができるので、ウェブアプリの作成の幅が広がりますね。