You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为现有客户端实现Rails通用WebSocket消息收发功能?

在Rails中实现兼容纯文本的WebSocket端点

因为ActionCable强制要求JSON格式的消息协议,而你的客户端无法修改,所以我们需要绕过ActionCable,直接用Rack自定义WebSocket端点来实现需求。

实现步骤

1. 添加依赖

在Gemfile中添加faye-websocket(用于处理WebSocket连接):

gem 'faye-websocket'

执行bundle install安装依赖。

2. 创建WebSocket处理类

在app/lib/clock_websocket_handler.rb中创建处理类,管理连接、消息接收和广播:

require 'faye/websocket'

class ClockWebSocketHandler
  KEEPALIVE_INTERVAL = 15 # 保持连接的心跳间隔(秒)

  def initialize(app)
    @app = app
    @connected_clients = []
  end

  def call(env)
    return @app.call(env) unless Faye::WebSocket.websocket?(env)

    ws = Faye::WebSocket.new(env, nil, { ping: KEEPALIVE_INTERVAL })

    # 客户端连接建立时
    ws.on :open do
      @connected_clients << ws
      puts "新客户端已连接,当前在线数:#{@connected_clients.size}"
    end

    # 处理客户端发送的消息
    ws.on :message do |event|
      if event.data.strip == 'requestTime'
        current_time = Time.now.iso8601 # 生成标准格式的系统时间
        # 向所有在线客户端广播时间
        @connected_clients.each do |client|
          client.send(current_time) if client.ready_state == Faye::WebSocket::OPEN
        end
      end
    end

    # 客户端断开连接时
    ws.on :close do
      @connected_clients.delete(ws)
      puts "客户端已断开,当前在线数:#{@connected_clients.size}"
      ws = nil
    end

    ws.rack_response
  end
end

3. 挂载WebSocket端点

修改config/routes.rb,将处理类挂载到/clock路径:

Rails.application.routes.draw do
  # 保留你现有的其他路由...

  mount ClockWebSocketHandler.new, at: '/clock'
end

4. 启动服务测试

启动Rails服务器后,客户端即可连接ws://localhost:3000/clock:

  • 客户端发送纯文本requestTime时,服务器会向所有已连接的客户端广播当前系统时间(ISO8601格式)
  • 完全兼容你现有的NodeJS/FastAPI验证过的客户端代码,无需任何修改

内容的提问来源于stack exchange,提问作者Nuubles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:45:20