2015-08-18 63 views
0
class MessagesController < ApplicationController 

    include ActionController::Live 

    def events 
    response.headers['Content-Type'] = 'text/event-stream' 
    sse = SSE.new response.stream 
    redis = Redis.new 
    redis.subscribe(redis_channel) do |on| 
     on.message do |event, data|    
     sse.write(data, event: 'messages.create') 
     end 
    end 
    #render nothing: true 
    rescue IOError 
    # disco bro! 
    ensure 
    redis.quit 
    sse.close 
    end 
end 

// also tried without the SSE.new, so just plain response.stream.write(data) 

我的JavaScript是簡單容易的WebSocket不能連接到的ActionController ::現場 - 失敗,200

var socket = new WebSocket("ws://localhost:3000/events") 
socket.onmessage = function (event) { 
    console.log(event);  
} 

當我在瀏覽器中調用/events和發送一些消息 - 它的輸出。但如果我們連接插座與JS我們得到

WebSocket connection to 'ws://localhost:3000/petra/events' failed: 
Error during WebSocket handshake: Unexpected response code: 200 

任何人都可以點亮我嗎?我們是否錯過了某些東西,或者我對自己想要做的事情有錯誤的理解。

+1

SSE和WebSocket是不同的協議。你不能用一個連接到另一個。您應該使用與RoR兼容的websocket庫。 – yiding

+0

http://pastie.org/10359879不會工作呢?所以AC :: Live只支持SSE? –

+0

似乎喜歡它。如果你想使用SSE,你可以改變你的客戶端來使用它,這可以更容易做到:'new EventSource(「/ events」);' – yiding

回答

0

WebSockets和服務器發送事件是不同的協議,不能以您嘗試的方式進行操作。

SSE的主要js API是EventSource(url)introductory article)。

如果您想雙向通信,您可以切換服務器端以改爲使用WebSockets。對於軌道上的紅寶石,websocket-rails是一個流行的庫來做到這一點。

相關問題