我想在rails ActionCable
之间建立一个连接,Server
和NodeJs
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
文件
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
应用程序的一些示例,其中server
和rails
都在smae client
平台上。但是,我没有找到Subscribe
在单独的平台上而不是服务器的任何示例。
但是,我无法找到user.get('account.email').valid
此通道的任何方法,并在两端建立稳定连接以传输数据,我也不知道如何从此请求中获取数据。
请帮帮我。提前致谢
答案 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
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();
App.sendmessage("Hello world");