如何关闭动作电缆中的连接?
Posted
技术标签:
【中文标题】如何关闭动作电缆中的连接?【英文标题】:How to close connection in Action cable? 【发布时间】:2017-03-22 13:51:38 【问题描述】:如何在 Action 电缆 (rails 5) 中断开客户端? 我希望用户完全断开连接(类似于他关闭选项卡时)。
【问题讨论】:
【参考方案1】:从您的 Rails 应用程序断开客户端
如果您想断开客户端与 rails 应用程序的连接,请使用文档中描述的 disconnect
方法:
https://api.rubyonrails.org/classes/ActionCable/RemoteConnections.html
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
....
end
end
ActionCable.server.remote_connections.where(current_user: User.find(1)).disconnect
从客户端断开
如果您想断开用户与客户端的连接,您可以在您的 javascript 中使用 disconnect
和 unsubscribe
函数:
App.cable = ActionCable.createConsumer(...)
// Closes the websocket connection.
App.cable.disconnect();
// Unsubscribe from a actioncable subscription (without disconnecting the websocket connection)
App.example = App.cable.subscriptions.create(..);
App.example.unsubscribe();
【讨论】:
这会删除一个或多个订阅 - 但它不会关闭 websocket。 @ConfusedVorlon 是的,这个答案似乎不正确。 我更新了答案,让客户端完全关闭连接。 @TomRossi【参考方案2】:我在 /var/lib/gems/2.3.0/gems/actioncable-5.0.1/lib/action_cable/remote_connections.rb 中找到了这个
如果您需要断开给定的连接,您可以通过 远程连接。您可以通过以下方式找到您正在寻找的连接 搜索连接上声明的标识符。例如:
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
....
end
end
ActionCable.server.remote_connections.where(current_user: User.find(1)).disconnect
这将断开为建立的所有连接 User.find(1),跨所有机器上运行的所有服务器, 因为它使用所有这些服务器所在的内部通道 订阅了。
希望这将是有用的。看起来它甚至可以在 Rails 控制台中使用。
【讨论】:
【参考方案3】:与客户端断开连接
我也偶然发现了这个问题。但我不敢相信没有简单的方法可以断开 websocket 与客户端的连接(不进行 API 调用)。幸运的是,这对我有用:
// Create consumer
window.cable = ActionCable.createConsumer(...)
// Subscribe to channels
window.cable.subscriptions.create('SomeChannel', ...);
// At some point we want to disconnect (e.g. when user logs out)
window.cable.subscriptions.consumer.disconnect();
【讨论】:
当我这样做时,我应该看到网络下的 websocket > WS 消失了吗?我在控制台中看到连接已经结束,但我仍然看到控制台中的 WS 徘徊。【参考方案4】:要与客户端断开连接(在 js 中),请调用
App.cable.disconnect();
与服务器端断开连接 - 请参阅@prograils 的答案
【讨论】:
【参考方案5】:我的解决方法是为断开连接创建一条新路由。
def disconnection
ActionCable.server.remote_connections.where(connected_user: user_params['email']).disconnect
render json: , status: 200
end
客户端必须调用端点......类似于
PUT /api/cable/disconnection
【讨论】:
【参考方案6】:关闭来自 channel
的所有 websocket 连接,
connection.close
从客户端退订
App.cable.disconnect();
从外部连接/通道断开
ActionCable.server.remote_connections.where(current_user: User.find(params[:id])).disconnect
【讨论】:
以上是关于如何关闭动作电缆中的连接?的主要内容,如果未能解决你的问题,请参考以下文章