本項目は設計変更(2012/08/07-1)により一部変更となった
起案(2012/07/26)
はじめに
WebSocketはブラウザを介してサーバーとの双方向通信を行えるようにした規格で、ブラウザ上ではJavaScriptを使ってソケット通信を行うことが出来る。
サーバー側はJetty、jWebSocketなどがあるが、その性質上Javaで作られたものが多いように思われる。
Apacheが対応してくれれば有難いのだが、それを待つのも何なので、自社で使えるWebSocketサーバーを作成しようと思いたった。
WebSocketの仕様によると、最初にWebSocketのクライアントからWebSocketのサーバーへ特定の形式の接続要求が来る。その後、サーバーがその要求内容に合わせたレスポンスを行うことによってハンドシェイクを行い、その後は双方向通信が可能となる。
双方向通信のやり方も決まっており、ベースフレーミングプロトコルに従ってカプセル化されたデータを送受信する必要がある。br />
もちろん、WebSocketクライアントとWebSocketサーバーの間のデータのやり取りはやり取りするデータの内容によって異なるため、後からサーバープログラムとして追加できなければならない。
このように通信手順をある一定方法で行う必要が有る上に、通信内容自体はそれぞれ独自で書くことが必要なことから、WebSocketサーバーのプログラムはJavaが多いと推察できる。
今回作成するWebSocketサーバーはUNIXのinetdと同様に、通信手順自体は作成するWebSocketサーバーで処理し、実際のデータ通信部分はWebSocketから起動されるサーバープログラムによって処理するように作成する。
WebSocketサーバーは設定ファイルに書いてあるポート番号で待機し、WebSocket用のリクエストが来るとハンドシェイクを行った後、設定されたサーバープログラムを起動する。
サーバープログラムとWebSocketサーバーとのデータのやり取りは標準入出力パイプを使用して行う。
サーバープログラムでは単純に出力するデータをデータ長付きで出力し、WebSocketサーバーでそれらをベースフレーミングプロトコルでカプセル化して送信する。
クライアントからのデータはWebSocketサーバーで受信し、それらをデータ長付きのデータに変換してサーバープログラムに渡す。
以上を図にまとめると以下のとおりとなる。