Newer
Older
jikken / ws_server.rb
# ws_server.rb
require 'faye/websocket'
require 'eventmachine'
require 'json'

$clients = []

EM.run {
  server = WEBrick::HTTPServer.new(Port: 8080)

  server.mount_proc '/ws' do |req, res|
    if Faye::WebSocket.websocket?(req)
      ws = Faye::WebSocket.new(req, nil, {ping: 15})

      ws.on :open do |event|
        $clients << ws
      end

      ws.on :message do |event|
        begin
          data = JSON.parse(event.data)
          # ユーザーの位置と名前をブロードキャスト
          $clients.each do |client|
            next if client == ws
            client.send(data.to_json)
          end
        rescue => e
          puts "JSON Parse Error: #{e.message}"
        end
      end

      ws.on :close do |event|
        $clients.delete(ws)
        ws = nil
      end

      # 必須
      ws.rack_response
    else
      # 普通のHTTPリクエストの処理
      res.status = 400
      res.body = 'Not WebSocket'
    end
  end

  trap("INT") { server.shutdown }
  server.start
}