首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用puma和tubesock的活动websocket连接列表

使用puma和tubesock的活动websocket连接列表
EN

Stack Overflow用户
提问于 2015-10-13 00:22:34
回答 1查看 448关注 0票数 1

我正在使用Puma和Tubesock处理websocket消息,并希望访问处理发送消息的库文件中的已连接websocket列表。我尝试做的是检查用户是否通过websocket连接,如果不是,则通过推送通知发送消息。

用户使用包含其userid的路径连接到websocket:

代码语言:javascript
复制
# config/routes.rb
Rails.application.routes.draw do
  get 'ws/:user_id', to: 'socket#ws', as: :socket
end

,并在控制器中使用Tubesock。

代码语言:javascript
复制
class SocketController < ApplicationController
  include Tubesock::Hijack

  def ws
    hijack do |tubesock|
      @wsTube = tubesock

      tubesock.onopen do
        socket_user = User.find_by_user_id(params[:user_id])
        # setup to send/receive messages through /lib/notification.rb
      end

      tubesock.onclose do
        # cleanup when connection closes
      end
    end
  end
end

我想过在数据库中为用户添加一个属性,但我担心如果连接突然终止,比如在重启期间,那么该属性将显示为connected,而事实并非如此。理想情况下,我希望检查活动的连接,而不是在打开和关闭期间切换属性。

EN

回答 1

Stack Overflow用户

发布于 2015-10-13 01:35:45

考虑到你的问题,而不是你问题的标题,在我看来,只有当Tubesock#send_data返回一个真实的值时,你才应该将消息标记为“已读”。

从源代码中可以看出,如果成功,Tubesock#send_data将返回一个数字;如果失败,它将返回nil (请注意,如果websocket有onclose回调,它可能会返回一个未确定的值)。

至于在数据库中存储Tubesock套接字,这是根本不可能的,因为Tubesock包含socket对象,该对象是一个打开的文件描述符,并且不能以持久的方式存储到数据库中。

您可能应该将数据存储在本地内存中,例如Hash。

如果Tubesock支持connection的UUID,那将是一个不同的故事,它也将允许您从单个进程扩展并使用Redis……但快速浏览一下(我不是Tubesock用户),情况似乎并非如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33085808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档