Ruby on rails Rails Faye Websocket客户端只发送一条消息
我正试图从我的控制器向所有注册的客户端广播一条消息。 我发现更好的方法是在我的控制器中创建一个Faye客户端,发送我的消息,并在消息发送后立即关闭它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))
#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准确复制文档,但它没有回答我的问题。制作一个模块并以这种方式使用它。谢谢,我会尝试的,因为我发现的解决方案会随机导致无限循环。实际上,主线程上的停止次数比无限循环多