Rails ActionCable 连接(服务器)与 NodeJs(客户端)
Rails ActionCable Connection(Server) with NodeJs(Client)
我想在 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
文件中的 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
频道并将 transmit
数据通过此通道发送到 Rails 服务器。
我在 rails 操作服务器上找到了一些 chat
应用程序示例,其中 client
和 server
都在 smae rails
平台上。但是,我还没有找到 client
与服务器不同的例子。
但是,我无法为这个通道找到任何方法 Subscribe
并在两端建立稳定的连接来传输数据,我也不知道如何从这个请求中获取数据。
请帮帮我。提前致谢
试试这个。 socketchannel 的发送订阅和设置标识符是重点。
rails
# 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");
我想在 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
文件中的 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
频道并将 transmit
数据通过此通道发送到 Rails 服务器。
我在 rails 操作服务器上找到了一些 chat
应用程序示例,其中 client
和 server
都在 smae rails
平台上。但是,我还没有找到 client
与服务器不同的例子。
但是,我无法为这个通道找到任何方法 Subscribe
并在两端建立稳定的连接来传输数据,我也不知道如何从这个请求中获取数据。
请帮帮我。提前致谢
试试这个。 socketchannel 的发送订阅和设置标识符是重点。
rails
# 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");