Websocketと上手く付き合う 〜websocketとflashとwebkit
この記事は約2分で読み終わります
最近、色々やっていたことのまとめな感じで悩んだことなど。
Websocketとは
websocketとは言わずと知れたHTML5に含まれようとしていた仕様であったが、HTML5の枠を超えようとしている規格である。このwebsocketは使い手側からはあまり今までと変わりがない。というのは、外部仕様的には今までAjaxやcometなんかでも実現できたことが内部仕様的に変わるだけだから。要は今までhttpプロトコルというrequestとresponseという一連の流れのセットで扱わなければならなかったものをwebsocketというプロトコルでセットで扱わなくても良い、という話になったということだ。ものすごく乱暴な言葉で言うと、「(Requestないけど)いきなりResponseぅ!!」みたいなことができる、と(笑)。
ちょっとだけ丁寧に言うと、Ajaxは非同期通信がとかページの一部を変更とか色々言われるけれども 「サーバからクライアントへ通信を行なう方法」がないことには違いはない。要はrequestありきであることには変わりはない。これに外部仕様的に解決しようとしたのがcometでいわゆるロングポーリングを行うことによって擬似的にこれを解決しようとしてきた。これは利用者にとっては関係ないかもしれないが、リソースの問題とかあってすっきりさっぱりではなかったんだけど、じゃぁ内部仕様的にも解決を、と出てきたのがwebsocketということになる。
Websocketを扱うときの問題
(1)アプリケーションサーバの選択
Websocketを扱うには、まずアプリサーバの問題がある。Javaの世界でいえば「とりあえずTomcat」とかはできない。なぜなら、Websocketに対応してくれていないないのでクライアント側の一人遊びになってしまうからだ。じゃぁ、どうするか。それはサーバを作ってしまえばよい、とか言うのは簡単だが「ごめんなさい」って感じなので、Websocketに対応したサーバを選べばよい。Rubyはその辺りは結構進んでいて古橋さんのrev-websocketとか使えば上手くいく。Javaなら今はJettyが本命なのだと思う。JettyにはWebsocketインタフェースを実装したりすることで結構簡単に実装可能になっている。Jettyのバージョンがあがるとインタフェースが結構変わって言っているが、丁寧にAPIを読めば理解と実装は可能なレベルだ。
(2)flashの力を借りる
websocketはクライアントとサーバをまずhttpで通信を開始して、Javascriptでwebsocketオブジェクトを生成して、以降はWSプロトコル上でやり取りを行う。このときクライアント側がWebsocket通信できないことがある。ブラウザのエンジンがWebsocketに対応していない場合である。今や色んなブラウザがWebsocketに対応し始めているが、2011年の頭くらいだと、Chrome以外は微妙な感じだった。それは昨今のタブレットでも同じことでWebビューを使うときに使用しているWebkitがWebsocketに対応していないと当然のことながらWebsocket通信はできない。
この解決策をflashが与えてくれる。Websocketに対応していないところをflashが解決してくれる。分かり易いところではAndroid環境はWebsocketに対応していないのでflashが必要になる。要はflashが必要な通信環境を整えてくれるわけだ。なので、同じ実装を行ったとしてもAndroid端末からつなぐのとiOS端末からつなぐのでは、前者はflashを使った通信をしなければならないが、後者は純粋にWebsocket通信が可能となっている。それでも結局サーバとクライアントの通信はSocketで行われているのでサーバの実装を変えるなんて必要は微塵もない。もっというとクライアントもアプリ部分の実装は変える必要はなく、Websocketを使えない環境ならばflashを使った通信に切り替えるという実装を追加してあげるだけでよい。
(3)Webkitのいたずら
私は当初Webkitはひとつしかないと思っていたらば、前述のflashの力を借りる過程において様々なWebkitがあることに気付いた。一口にWebkitといってもAndroidで使用されているWebkit,iPadで使用されているWebkit、PC版のWebkitなどなど色々とあって、それぞれにWebsocketに対応している/していない、なんてことがあるので注意が必要だ。
結局のところ、新しい仕様であることに変わりはないものの、Socket通信であることには変わりはないのでその辺りをしっかりと理解していれば外側の現象に惑わされることは少ない・・・かもしれない。