Rails ActionCable连接(服务器)与NodeJs(客户端)
我想创build一个轨道ActionCable
之间的连接, NodeJs
作为Client
Server
和NodeJs
。
这是我在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
应用程序的轨道动作服务器的例子, client
和server
都在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");