如何关闭动作电缆中的连接?

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 中使用 disconnectunsubscribe 函数:

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

【讨论】:

以上是关于如何关闭动作电缆中的连接?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 6 - 动作电缆问题

如何更改动作电缆导轨中的 ping 间隔

如何使用连接 USB 电缆调试在 Xcode 未启动的移动设备中执行的 iOS 应用程序

如何使用java套接字编程知道网络何时关闭

如何将同一表中的一条记录与另一条记录关联?

linux 失败无连接 检查电缆吗