2016-11-22 128 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,并得到更好的理解。我知道你已经解决了这个问题..但我想讨论一下这个问题

我还不清楚!