2021年10月7日木曜日

Sinatra で自作 websocket サーバを実装する

Sinatra で自作 websocket サーバを実装する

概要

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

動作確認

でサーバを起動します
動作確認は適当な Websocket クライアントを使います
今回はこちらを使いました (ブラウザの Extension などもあるのでそれでも OK です)

接続先は ws://localhost:9292 を指定しましょう

あとは接続して適当にメッセージを送信してみるとちゃんとメッセージが返ってくるのが確認できると思います

最後に

最近だと無料で使える MQTT/Websocket サービスがあるのでそれを使ったほうが良いかなと思います

自分でメッセージのハンドリングや加工をしたい場合には自作の websocket が役に立つと思います

参考サイト

0 件のコメント:

コメントを投稿