Ruby on rails Rails Faye Websocket客户端只发送一条消息

Ruby on rails Rails Faye Websocket客户端只发送一条消息,ruby-on-rails,ruby,heroku,faye,Ruby On Rails,Ruby,Heroku,Faye,我正试图从我的控制器向所有注册的客户端广播一条消息。 我发现更好的方法是在我的控制器中创建一个Faye客户端,发送我的消息,并在消息发送后立即关闭它 #my_controller.rb EM.run { ws = Faye::WebSocket::Client.new(Rails.application.config.websocket_url) ws.send(JSON.dump(this_order.service_json))

我正试图从我的控制器向所有注册的客户端广播一条消息。 我发现更好的方法是在我的控制器中创建一个Faye客户端,发送我的消息,并在消息发送后立即关闭它

#my_controller.rb

EM.run {
          ws = Faye::WebSocket::Client.new(Rails.application.config.websocket_url)
          ws.send(JSON.dump(this_order.service_json))
          EM.stop
      }
虽然这段代码部分有效,但它关闭了我与Faye的所有浏览器连接

Faye在中间件中实现,如下所示:

class FayeMiddleware
    KEEPALIVE_TIME = 30 # in seconds

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

    def call(env)
        if Faye::WebSocket.websocket?(env)
            # WebSockets logic goes here
            ws = Faye::WebSocket.new(env, nil, {ping: KEEPALIVE_TIME })
            ws.on :open do |event|
              p [:open, ws.object_id]
              @clients << ws
            end

            ws.on :close do |event|
              p [:close, ws.object_id, event.code, event.reason]
              @clients.delete(ws)
              ws = nil
            end

            ws.on :message do |event|
              p [:message, event.data]
              puts event.data
              @clients.each {|client| client.send(event.data) }
            end
            # Return async Rack response
            ws.rack_response
        else
            @app.call(env)
        end
    end
end
类中间件 保持有效时间=30秒 def初始化(应用程序) @app=app @客户=[] 结束 def呼叫(环境) 如果Faye::WebSocket.WebSocket?(环境) #WebSockets逻辑在这里 ws=Faye::WebSocket.new(env,nil,{ping:KEEPALIVE_TIME}) ws.on:开放do |事件| p[:打开,ws.object\u id]
@使用WebSocket客户端的客户端

客户端支持纯文本ws协议和加密的wss协议,并且具有与web浏览器中使用的套接字完全相同的接口。在电线上,它表明自己是hybi-13

require 'faye/websocket'
require 'eventmachine'

EM.run {
  ws = Faye::WebSocket::Client.new('ws://www.example.com/')

  ws.on :open do |event|
  p [:open]
  ws.send('Hello, world!')
end

ws.on :message do |event|
  p [:message, event.data]
end

ws.on :close do |event|
  p [:close, event.code, event.reason]
  ws = nil
end
}
WebSocket客户端还允许您通过其status和headers方法检查握手响应的状态和头

要通过代理进行连接,请将代理选项设置为代理的HTTP源,包括您需要的任何授权信息和自定义头:

ws = Faye::WebSocket::Client.new('ws://www.example.com/', [], {:proxy => {
         :origin  => 'http://username:password@proxy.example.com',
         :headers => {'User-Agent' => 'ruby'}
        }
    })
要获得更多帮助,请使用此

我找到了一个解决方案:

EM.run {
          ws = Faye::WebSocket::Client.new(Rails.application.config.websocket_url)
          ws.on :open do |event|
            ws.send(JSON.dump(this_order.service_json))
            ws.close
          end
      }
这将等待套接字打开,然后发送消息并关闭。我想没有必要停止事件机器

试试这可能会对你有所帮助。


感谢您从github准确复制文档,但它没有回答我的问题。制作一个模块并以这种方式使用它。谢谢,我会尝试的,因为我发现的解决方案会随机导致无限循环。实际上,主线程上的停止次数比无限循环多