RubyのHashのキーは文字列と数値を区別してた
同じ値のはずなのになんでHashから取り出せんのだー!
と思っていたら。。。
http://monmon.hateblo.jp/entry/20130116/1358321670
なるほど、Hashは文字列と数値で違うキーと認識されるのね。
SinatraでWebsocketチャットもどき
前回はwebsocket-railsでチャットもどきを作りましたが、
諸事情によりiOSから繋げられるWebsocketサーバを作りたかったがために
websocket-railsでは難しいことが判明。
そこでもうちょっと汎用的なWebsocketサーバを作るべく、Sinatraで作り直しました!
参考にしたのは、herokuが公開してるこれ。
あとは、コチラのブログも参考にしました!
んで、作ったのはコチラ!
では解説!
まずはサーバ側から!
app.rbはただのindex表示用。今回もViewはindexのみです。
で、backend.rbがキモなところですが、まずfaye/websocketをつかって、
wsオブジェクトを生成してます。で、ws.onで各イベントの処理を記載しています。
:open はWebsocketの接続時に実行されます。
clientに保存して、チャット人数表示用のcountメッセージを全クライアントに
送信してます。あと、50個だけ過去ログ保存するようにしているので、
それも送信しています。(これは新規接続したクライアントにだけ)
:messageは、chatの内容ですね。受け取ったら全クライアントに送信するだけ。
:closeはブラウザ閉じたり、Websocket切断時の処理です。
クライアント一覧の配列から該当のクライアントを削除して、チャット人数が減るので
それを全クライアントに送信する。
次にクライアント側です。
チャット送信ボタンを押すか、テキストボックスでEnterを押すと、
sentMessageが実行されます。27行目にWebSocketをnewしているので
そいつに対してsendを実行するだけ。
受信はonmessageです。チョー簡単ですね。
前回のwebsocket-railsでは、メッセージのラベルに対応するメソッドを呼び出すと
いう処理が隠蔽されているので、他のクライアントから繋ぐのは難しかったのですが
今回のバージョンでは単純なJSON形式なので、サーバ側のJSON解析如何で、
いくらでも処理は追加できそうです。
以上!
websocket-railsでチャットもどき
websocket-railsを使ってチャットもどきを作ってみました。
超絶参考にしたのはこのブログです。
あとはgithubのこの人のチャットシステムはすごーく参考になりました。
で、とりあえず作ったものはここに。
では解説!
まずはサーバ側から。
PublicControllerははただのindex表示用ですね。
で、configのevents.rbでクライアントのラベル(ここだと:new_message)に大して
どのコントローラの、どのメソッドを呼ぶか、というのを設定します。
これだとChatControllerのnew_messageメソッドが呼ばれるということですね。
んで、 ChatControllerを見ると、initialize_sessionとnew_messageのメソッドがありますね。
initialize_sessionはWebsocket接続時に呼ばれるメソッドです。
とりあえず標準出力してるだけ。
で、new_messageをみると、putsはただのデバッグ用出力なので気にしないとして
broadcast_messageを呼び出して、接続中の全てのクライアントに対して、
:new_messageというラベルとメッセージ内容(messageの変数に入ってます)を
送信してるだけです。
ではクライアント側を見てみましょう。
参考元のソースほぼそのままですね。サーセンww
4行目でdispatcherにWebSocketRailsをnewしてます。
あ、ちなみにurlはindex.html.erbから取得してますよ。
でbindEvents()で、イベントを監視します。
まずメッセージ送る方はsendMessageメソッドでさすね。
サーバへなんか送るときは@dispatcher.triggerを使います。
で、new_messageのラベルと、メッセージ内容をJSON形式で送ってます。
new_messageのラベル付けることで、前述したサーバ側で対応するメソッドが
呼び出されるということですね。
このラベルの種類を増やすと色々やれるような感じです。
で、サーバ側から受け取るのは@dispatcher.bindです。
単純にhtmlにappendしてるだけです。ざっとこんな感じです。
websocket-rails使うと、かなり簡単にwebsocketを使ったWebアプリが作れますね!
ただし、このgemはクライアントとサーバをセットで使うことが前提なので
他のデバイスからも接続できるような汎用的な用途としては向いてません。
※パケットキャプチャしてみると、pingpongも独自に設定されているようなので。