与NodeJs(客户端)的Rails ActionCable连接(服务器)

时间:2017-06-15 00:50:32

标签: ruby-on-rails node.js websocket client-server actioncable

我想在rails ActionCable之间建立一个连接,ServerNodeJs Client

这是我在connection.rb档案中的代码。

 # app/channels/application_cable/connection.rb
 module ApplicationCable
   class Connection < ActionCable::Connection::Base
    identified_by :uuid

    def connect
     self.uuid = SecureRandom.uuid
    end
  end
 end

这是我频道的代码。

 # app/channels/socket_connection_channel.rb
 class SocketConnectionChannel < ApplicationCable::Channel
  def subscribed
   stream_from "socket_connect"
  end

  def speak
    ActionCable.server.broadcast("socket_connect",
                             message: "Connected")
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
   end

 end

这是server.js文件

中的NodeJs代码
   const WebSocket = require('ws');

   const ws = new WebSocket('ws://0.0.0.0:3001/cable');

   ws.on('open', function open() {
     ws.send(JSON.stringify({'data': 'Sample Data'}));
   });

    ws.on('message', function incoming(data) {
     console.log(data);
     });

   ws.on('socket_connected', function incoming(data) {
      console.log('socket');
    });

当我运行服务器node server

  {"type":"welcome"}
  {"type":"ping","message":1497487145}
  {"type":"ping","message":1497487148}
  {"type":"ping","message":1497487151}

并在rails服务器上显示以下日志

     Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-06-15 
    02:39:02 +0200
      Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
      Registered connection (5db66385-0923-4633-8837-ba957fc0a7f5)
      Received unrecognized command in {"data"=>"Sample Data"}

我想要实现的是node server将在rails ActionCable上建立Websocket连接并订阅SocketConnect Channel并将transmit数据通过此chat发送到Rails服务器信道。

我在rails操作服务器上找到了client应用程序的一些示例,其中serverrails都在smae client平台上。但是,我没有找到Subscribe在单独的平台上而不是服务器的任何示例。

但是,我无法找到user.get('account.email').valid 此通道的任何方法,并在两端建立稳定连接以传输数据,我也不知道如何从此请求中获取数据。

请帮帮我。提前致谢

1 个答案:

答案 0 :(得分:2)

试试这个。发送socketchannel的订阅和设置标识符非常重要。

# app/channels/socket_connection_channel.rb
 class SocketConnectionChannel < ApplicationCable::Channel
  def subscribed
   @uuid = params[:uuid]
   stop_all_streams
   stream_from "socket_connect_#{@uuid}"
   logger.info ">>> Subscribed #{@uuid}!"
  end

  def speak
    logger.info "[ActionCable] received message : #{data['message']}" 
    ActionCable.server.broadcast "socket_connect_#{@uuid}", message: "#{data['message']} from server"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
   end

 end

的node.js

var App = {};

App.sendmessage = function(send) {
  data = {
    message : send,
    action : "speak"
  };
  message = {
    command: "message",
    identifier: JSON.stringify(App.param),
    data: JSON.stringify(data)
  };    
  App.ws.send(JSON.stringify(message));
}

App.connect_server = function() {         
  const WebSocket = require('ws');
  App.ws = new WebSocket('ws://0.0.0.0:3001/cable', ["actioncable-v1-json", "actioncable-unsupported"]);

  App.param = {channel: "SocketConnectionChannel", uuid: guid()};

  App.ws.on('open', function open() {
    data = {
      command: "subscribe",
      identifier: JSON.stringify(App.param)
    }
    App.ws.send(JSON.stringify(data));
  });  
  App.ws.on('message', function (event) {
    console.log(event);
  });
  function guid() {
   function s4() {
     return Math.floor((1 + Math.random()) * 0x10000)
      .toString(16)
      .substring(1);
   }
   return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
    s4() + '-' + s4() + s4() + s4();
  }
}
App.connect_server();

的node.js

App.sendmessage("Hello world");

https://github.com/mwalsher/actioncable-js也对您有所帮助。