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解析如何で、
いくらでも処理は追加できそうです。
以上!