概要
Sinatra を使って websocket サーバを実装する方法を紹介します sinatra-websocket という gem があるのでこれを使うと簡単に実装できます
環境
- macOS 11.6
- Ruby 3.0.2p107
- sinatra 2.1.0
準備
- bundle init
- vim Gemfile
gem "sinatra"
gem "sinatra-websocket"
gem "thin"
- bundle install
WebSocket サーバの実装
- vim app.rb
require 'sinatra'
require 'sinatra-websocket'
class WSApp < Sinatra::Base
set :sockets, []
get '/' do
if !request.websocket?
erb :index
else
request.websocket do |ws|
ws.onopen do
ws.send("Hello World!")
settings.sockets << ws
end
ws.onmessage do |msg|
EM.next_tick do
settings.sockets.each do |s|
s.send("Echo message: " + msg)
end
end
end
ws.onclose do
warn("websocket closed")
settings.sockets.delete(ws)
end
end
end
end
end
少し解説
!request.websocket?
でリクエストが websocket がどうか判断できます
ws.onopen
で接続時の処理を記載できます
ws.onmessage
でメッセージ受信時の処理を記載できます
ws.onclose
で切断時の処理を記載できます
接続しているクライアントごとにソケットを管理する必要があるので settings.sockets の配列でソケットを管理します
今回は受け取ったメッセージに「Echo message:」を付与してクライアント側に送信しています
サーバ起動スクリプト
require './app'
run WSApp
動作確認
- bundle exec rackup config.ru
でサーバを起動します
動作確認は適当な Websocket クライアントを使います
今回はこちらを使いました (ブラウザの Extension などもあるのでそれでも OK です)
接続先は ws://localhost:9292 を指定しましょう
あとは接続して適当にメッセージを送信してみるとちゃんとメッセージが返ってくるのが確認できると思います
最後に
最近だと無料で使える MQTT/Websocket サービスがあるのでそれを使ったほうが良いかなと思います
自分でメッセージのハンドリングや加工をしたい場合には自作の websocket が役に立つと思います
0 件のコメント:
コメントを投稿