runとするだけでデモを試すことが出来るようになってます。クライアントを実行すると下のスクリーンショットのようなウィンドウが立ち上がります。ウィンドウ内を適当にクリックすると「徐々に広がるアニメーションをする円」が表示されると思います。クリックしたマウス座標がブロードキャストで流れてくるので、自分がクリックした座標だけでなく、誰かがクリックした座標にも、円がレンダリングされます。一人で複数のクライアントを立ち上げると分かりやすいです。クライアントをアイドル状態でしばらく放置しておくと、コネクションが切れてしまうようです。その際はクライアントを再起動し、サーバーに再接続してください。サーバーを作るalephを使ってWebSocketサーバーを立ち上げるのは簡単です。true})これだけでWebSocketサーバーが立ち上がります。説明するまでもなくシンプルです。handlerはクライアントが接続してきた毎に呼ばれる関数で、この中でサーバーの振る舞いを定義します。"ping"という文字列に対して"pong"とレスポンスを返すhandlerは下のように書けます。"pong")))))引数のchはlaminaのchannelです。キューのようなものと考えてください。上で説明したように、このchannelに対して、メッセージを出し入れしてサーバーとクライアントがコミュニケーションをします。receive-allはイベントリスナーの設定関数のようなもので、chに入ってきたメッセージ毎に指定した関数が呼ばれます。今回のデモプログラムでは接続してきた全クライアントに対してブロードキャストでメッセージを返すので、ブロードキャスト用のchannelを1つ作成するクライアントから来たメッセージが来たら、ブロードキャスト用のchannelにそのメッセージを入れるブロードキャスト用のchannelにメッセージが来たら、そのメッセージをそのままクライアントに返すのようにします。handlerは下のコードようになります。msg))))これだけでブロードキャストのWebSocketサーバーの完成です。herokuで動かすためのコードなどを加えると、サーバーは下のようなコードになりました。port))stop関数は必要ないですが、REPLでサーバーを再起動させたりしてデバッグするときに便利です。heroku上で動かす際の注意点herokuはWebSocketをサポートしていますが、まだexperimentalのようです。websocketsとWebSocketをenableにしないと動かないことに注意しましょう。それ以外は普通のWebアプリケーションと同じです。クライアントを作る次にクライアントを作ります。alephはクライアントがWebSocketサーバーに接続するのも簡単です。"ws://example.com:80"})とするだけです。接続が確立されるまではchannelにメッセージの出し入れが出来ないので、wait-for-result関数で接続確立を待ちます。c))のようにします。このchに対してenqueueしたりreceiveしたりすればメッセージのやりとりができます。まとめると、クライアントのコードは下記のようになりました。data)))レポジトリに置いてあるコードには、上記のコードに加えてquilのGUI部分のコードが加わっています。全体のフローはだいたい一緒です。今回はquilの部分の解説は割愛させて頂きます。非常にシンプルなコードなので、見て頂ければ簡単に理解出来ると思います。まとめ今回はWebSocketのサーバーサイドだけでなくクライアントサイドもClojureで実装してみました。Clojureらしくシンプルに実装できることが伝わったらうれしいです。alephまたはlaminaには今回紹介したもの以外にも様々な機能があります。laminaのchannelでもsiphonやmap*など紹介していない便利な関数があります。興味がある方は調べてみてください。JVMで書くならTCP/UDPで良いじゃんというツッコミもあると思います。その指摘は私も正しいと思います。WebSocketで実装することで、以下のような利点があると思います。80番ポートしか開いていないセキュリティ厳しい環境でも動かすことができる暗号化(SSL)の処理を外部プログラム(ライブラリ)に任せることができるブラウザ上(JavaScript)で動くWebSocketクライアントと同じサーバーのコードで運用できるな感じでしょうか。最初はWebSocketで作って、パフォーマンスの問題などが出て来たときにTCP/UDPに切り替えれば良いのかな、と思っています。