如何为现有客户端实现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
相关产品推荐
相关产品推荐

