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

我想创build一个轨道ActionCable之间的连接, NodeJs作为Client ServerNodeJs

这是我在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} 

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

  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将使WebSocket连接在Rail ActionCable并订阅SocketConnect Channel,并将通过此通道将数据传输到Rails服务器。

我发现一些chat应用程序的轨道动作服务器的例子, clientserver都在smae rails平台上。 但是,我还没有find任何client在服务器上的例子。

但是,我无法find任何方法来Subscribe此通道,并在两端build立稳定的连接来传输数据,我也不知道如何从这个请求获取数据。

请帮助我。 提前致谢

尝试这个。 发送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也对你有帮助&#x3002;

Interesting Posts