2016-04-11 19 views
1

Ich versuche, von meinem Controller eine Nachricht an alle registrierten Clients zu senden. Der bessere Weg, den ich gefunden habe, ist, einen Faye-Client in meinem Controller zu erstellen, meine Nachricht zu senden und direkt nach dem Senden der Nachricht zu schließen.Rails Faye Websocket Client nur eine Nachricht zu senden

#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 
     } 

Obwohl dieser Code teilweise funktioniert, schließt es alle meine Browser-Verbindungen zu Faye.

Faye in einer Middleware, wie dies umgesetzt:

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 

ich diesen Code gemacht this Tutorial bezieht.

Ich verstehe nicht, warum alle meine Web-Sockets geschlossen werden, wenn ich meine EM stoppe. Kann mir jemand helfen ?

+0

ein Modul machen und auf diese Weise nutzen. . http://stackoverflow.com/questions/33567167/how-can-i-push-to-faye-server-from-rails-controller/33567635#33567635 –

Antwort

0

Mit dem WebSocket-Client

Der Client unterstützt sowohl das Klartext-ws-Protokoll und das verschlüsselte WSS-Protokoll und hat genau die gleiche Schnittstelle wie ein Buchse Sie in einem Web-Browser verwenden würden. Auf dem Draht identifiziert es sich als 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 
} 

Das WebSocket-Client kann Sie auch den Status und die Header der Handshake-Antwort über seinen Status und Header Methoden untersuchen.

ws = Faye::WebSocket::Client.new('ws://www.example.com/', [], {:proxy => { 
     :origin => 'http://username:[email protected]om', 
     :headers => {'User-Agent' => 'ruby'} 
     } 
    }) 

für weitere Hilfe Nutzung dieser link

+0

Vielen Dank für das Kopieren genau das Dokument von Github, aber es tut nicht antworte auf meine Frage. – Shrolox

0

I:

Um über einen Proxy, stellen Sie die Proxy-Option auf den HTTP-Ursprung des Proxy, einschließlich Berechtigungsinformationen und benutzerdefinierte Header Sie benötigen zu verbinden found a solution:

Dies wartet auf den Socket zu öffnen, dann senden Sie die Nachricht und schließt. Keine Notwendigkeit, die EventMachine zu stoppen, denke ich.