2016-11-22 230 views
1

我正在使用Rails5爲我的應用程序創建api提供程序,並且我需要使用websocket。未收到廣播

然後,我創建了測試一個非常簡單的代碼:

的routes.rb

Rails.application.routes.draw do 

    mount ActionCable.server => '/cable' 

    get '/testbroad', to: 'messages#testbroad' 

end 

messages_channel.rb

class MessagesChannel < ApplicationCable::Channel 

    def subscribed 
    stream_from 'messages' 
    end 

end 

messages_controller.rb

class MessagesController < ApplicationController 

    def testbroad 
    ActionCable.server.broadcast('messages', 
           message: 'foo') 
    head :ok 
    end 

end 

然後,我用捲曲

➜ ~ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: ws://localhost:3000/cable" http://localhost:3000/cable 
HTTP/1.1 101 Web Socket Protocol Handshake 
Upgrade: WebSocket 
Connection: Upgrade 
WebSocket-Location: ws://ws://localhost:3000/cable/cable 

{"type":"welcome"} 

這是工作開始的連接!但是,當我試圖發送廣播...

➜ ~ curl http://localhost:3000/testbroad 

Rails的控制檯顯示成功,但我沒有收到任何消息在cURL中。爲什麼我沒有收到消息「foo」?如何解決它?

回答

1

幾個小時後,我發現了這個問題。

此圖像是啓動WebSocket連接的網頁中的網絡調試。 enter image description here 表格的第一行顯示瀏覽器發送給服務器的消息,{"command":"subscribe","identifier":"{\"channel\":\"MessagesChannel\"}"}

建立連接後,我需要發送一條消息給我要訂閱的頻道。這不是寫在Rails的文檔中。

+0

我發佈了一個答案,討論在這個問題上行動電纜如何工作。你能幫助我更好地理解這個問題嗎?謝謝 –

0

我也想更好地理解這一點,所以基本上你訂閱了,但你沒有發佈任何消息。他們這裏的關鍵是執行messages#testbroad

ActionCable.server.broadcast('messages', 
          message: 'foo') 
head :ok 

訂閱設置文件中app/channels/messages_channel.rb

我引用documentation

3.2.2訂閱

消費者訂閱頻道,作爲訂戶。他們的連接稱爲訂閱。生成的消息隨後根據有線電視消費者發送的標識符路由到這些頻道訂閱。

def subscribed 
    stream_from 'messages' 
end 

我相信這將能夠明白,訂閱了該通道

基於由電纜消費者發送的標識符消費者

(電纜消費者從redis db讀取的那個)。通過這種方式,它可以理解想要接收通知並且不再訂閱活動通道的用戶,在app/assets/javascripts/channels/messages.js中將觸發App.cable.subscriptions.create('MessagesChannel')在客戶端前端發佈消息。

App.cable.subscriptions.create('MessagesChannel', {  
    received: function(data) { 
     $('#messages').append(this.renderMessage(data)); 
    }, 
    renderMessage: function(data) { 
     return "<br><p> <strong>" + data.user + ": </strong>" + data.message + "</p>"; 
    } 
}); 

我張貼的答案,討論有關ActionCable,並得到更好的理解。我知道你已經解決了這個問題..但我想討論一下這個問題

我還不清楚!