TL;DR
Mocket では、WebSocket のルートを ws メソッドで登録する。ハンドラは接続、受信、切断のイベントを受け取り、Pub/Sub のチャネルも使える。
内容
イベント
ハンドラは WebSocketEvent 列挙型を受け取る。
Open(WebSocketPeer): 新しい接続が確立されたときに呼ばれるMessage(WebSocketPeer, WebSocketAggregatedMessage): メッセージを受信したときに呼ばれる。メッセージはText、Binary、PingのいずれかであるClose(WebSocketPeer): 接続が閉じられたときに呼ばれる
app.ws("/ws", event => match event {
Open(peer) => println("WS open: " + peer.to_string())
Message(peer, msg) =>
match msg {
Text(s) => {
println("WS message: " + s)
peer.text(s)
}
Binary(bytes) => {
println("WS binary: " + bytes.length().to_string() + " bytes")
peer.binary(bytes)
}
Ping => {
println("WS ping")
peer.pong()
}
}
Close(peer) => println("WS close: " + peer.to_string())
})WebSocketPeer
WebSocketPeer 構造体は接続中のクライアントを表し、やりとりのためのメソッドを持つ。
text(message: String): クライアントにテキストメッセージを送るbinary(message: Bytes): クライアントにバイナリメッセージを送るsubscribe(channel: String): クライアントを Pub/Sub のチャネルに購読させるunsubscribe(channel: String): クライアントのチャネルの購読を解除するpublish(channel: String, message: String)(静的メソッド): チャネルの購読者全員にブロードキャストする
Pub/Sub の例
接続時にチャットルームのチャネルを購読させ、参加を全員に知らせる例である。
app.ws("/chat", event => match event {
Open(peer) => {
peer.subscribe("chat_room")
@mocket.WebSocketPeer::publish("chat_room", "User joined")
}
Message(peer, msg) =>
match msg {
Text(msg) => peer.text(msg)
_ => ()
}
Close(peer) => peer.unsubscribe("chat_room")
})