【问题标题】:Not receive broadcast收不到广播
【发布时间】:2017-04-06 14:06:48
【问题描述】:

我正在使用 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 开始连接

➜  ~ 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”?如何解决?

【问题讨论】:

    标签: ruby-on-rails websocket actioncable


    【解决方案1】:

    几个小时后,我发现了问题。

    此图像是启动 WebSocket 连接的页面中的网络调试。 表格的第一行显示了浏览器发送到服务器的消息{"command":"subscribe","identifier":"{\"channel\":\"MessagesChannel\"}"}

    建立连接后,我需要向我要订阅的频道发送消息。它没有写在 Rails 的文档中。

    【讨论】:

    • 我发布了一个答案来讨论此问题中动作电缆的工作原理。你能帮我更好地理解这个问题吗?谢谢
    【解决方案2】:

    我也想更好地理解这一点,所以基本上你订阅了但你没有发布任何消息。他们这里的关键是执行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 并获得更好的理解。我知道你已经解决了这个问题..但我想讨论一下这个

    我还是不清楚!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多