クイックノート

ちょっとした発見・アイデアから知識の発掘を

R で WebSocket サーバーを作ってみる【httpuv】

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 のインストールを行います。

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 サーバーを立てて、サーバーに処理をもらえば、
サーバーで好きな言語で処理ができるので、ウェブアプリの作成の幅が広がりますね。

プライバシーポリシー