Phoenix 频道:向特定客户端发送推送

2024-03-23

您好,我正在尝试使用 Elixir phoenix 重新实现 Whatsapp 功能。我在计算以下内容时遇到问题:如果聊天室中的所有人都收到了消息,我想向消息所有者发送“已收到”状态,以便他可以显示双勾号。但是,如何向某一特定客户端进行广播呢?


您可以通过每个用户的主题来解决这个问题,这可以通过模式匹配轻松实现,还要注意安全验证:

def join("users:" <> user_id, _params, socket) do
    {user_id, _} = Integer.parse(user_id)

    %{id: id} = socket.assigns[:user]

    #prevent connection to solo channel of other users, but allow in development
    case id == user_id || Mix.env == :dev do
      true ->
        {:ok, socket}
      false ->
        {:error, "This is not your solo channel!"}
      end
  end

正如您存储的用户一样Repo.get当用户连接到套接字时:

defmodule MyApp.UserSocket do
  use Phoenix.Socket

  def connect(%{"token" => token}, socket) do
    case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do
      {:ok, user_id} ->
        socket = assign(socket, :user, Repo.get!(User, user_id))
        {:ok, socket}
      {:error, _} -> #...
    end
  end
end

最后,您可以在套接字上下文之外向特定用户发送消息,如下所示:

YourAll.Endpoint.broadcast user_topic, "message", %{details: "etc"}

为了测试性能,这是一个内容丰富的会议 http://www.archive.elixirconf.eu/elixirconf2016/gary-rennie其中 Gary Rennie 展示了如何使用 Tsung 工具对 WebSocket 进行基准测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Phoenix 频道:向特定客户端发送推送 的相关文章

随机推荐

  • 从我的 Android 应用程序中的网页获取点击事件

    我正在创建一个带有按钮的示例网页 该网页正在 Android 中使用 webview 进行调用 现在 当我单击网页上的按钮 即 html 按钮 时 我应该能够在 Android 中执行一些代码 如何进行 public class web e
  • 如何使用 Google Apps 脚本将 Google 表格单元格中的文本字符串解析为 CSV 文件?

    我在使用 Google Apps 脚本解析 Google 表格单元格中的字符串时遇到问题 我使用了JavaScript方法Array indexOf 但未能找到单元格中字符串中存在的字符 我尝试在单元格中字符串的字母之间插入下划线 但每个单
  • Linq 每次迭代选择 5 个项目 [重复]

    这个问题在这里已经有答案了 Linq 根据我们的枚举器每次选择 5 项 我们的清单例如 theList has 100 件 想要浏览列表并每次迭代选择 5 个项目 示例代码 我们希望将其更改为我们想要的结果 theList dt AsEnu
  • 使用具有belongsTo关系的访问器变元

    使用 Laravel 4 我在我的 User 模型中设置了一个 mutator public function getFullnameAttribute value return this gt first name this gt las
  • 当处理程序已经存在并绑定时,JQuery stopPropagation on .live()

    我知道文档中会出现实时通话 这就是我遇到问题的原因 不幸的是 我正在使用绑定元素的第三方库 并且希望创建一个单击事件不会冒泡到这些元素的情况 将 click 与 eventStopPropogation 结合使用效果很好 但是由于内容的动态
  • 使用 PySide2 在 QTableView 中设置文本样式

    我有一个 QTableView 填充了正确的模型 我想根据上下文更改文本的样式 文本 如果括号之间有内容 则这部分文本应更改为绿色 包括括号 并且粗体 只要它不难 如果您可以提供一个片段或超级简单的示例 我将不胜感激 您必须使用一个委托来使
  • CosmosDB C# SDK ProyUrl 缺失

    我正在 NET Core 中开发一个针对 Azure 的容器化微服务项目 docker 因此 我们使用 Azure Cosmos DB 和 CoreSql Api 的 C Cosmos DB SDK v2 4 因为 v3 仅处于预览版 在开
  • 如何从包含 XML 的字符串中删除第一行?

    我有一个包含 XML 的字符串 我想删除它的第一行并将其保存回 String 我怎样才能做到这一点 Thanks 假设您想要删除字符串末尾的新行 您可以执行以下操作 s s substring s indexOf n 1 当没有新的线路时
  • 如何配置 jdee `find-class-source-file` 以与 Cassandra 源树一起使用?

    我正在尝试为我即将开始的 Java 项目设置 Emacs JDEE 但我无法让 JDEE 正常工作 我想要解决的第一个问题是能够跳转到给定类名的源文件 我正在使用卡桑德拉 http cassandra apache orgsource 作为
  • Jquery 点击图像时切换

    我想了解 jquery 切换是如何工作的 我想切换到下一个锚点plr anchor单击带有类的图像go down 数据是使用地图填充的 Jquery代码 go down on click function e plr anchor next
  • C# 在txt文件中搜索字符串

    我想在 txt 文件中找到一个字符串 如果字符串比较 它应该继续读取行 直到我用作参数的另一个字符串 Example CustomerEN search for this string some text which has details
  • 使用 DirectShow 捕获帧并使用 OpenCV 进行处理

    我为视频到图像捕获制作了两种不同的解决方案 并且想知道是否可以将两个世界的优点结合在一起 我目前正在使用 DirectShow 加载 AVI 文件并捕获图像 然而 DirectShow 缺乏图像处理功能并且需要制作额外的滤镜 这让我陷入了困
  • 将数据从一个数据表复制到另一个具有不同结构的数据表的最佳方法

    我正在将数据从 DataTable 复制到另一个具有结构的 DataTable 我必须在循环中对列号进行硬编码 并将数据复制到对象数组中 实现这一目标的最佳方法是什么 IEnumerable
  • 重置张量流流指标的变量

    我有很多流媒体指标 tf metrics accuracy and custom http vict0rsch github io 2018 06 06 tensorflow streaming multilabel f1 流媒体micro
  • 删除嵌入的 YouTube 视频上的注释

    我发现您可以通过添加参数来禁用嵌入式 YouTube 视频上的注释 iv load policy 3到嵌入代码中的 url 例子
  • 带有 ref 对象参数的方法

    嗨 我必须调用具有此签名的方法 int MethodName ref object vIndexKey 如果我尝试用 String c 690 MethodName ref object c 这不起作用 我能怎么做 thanks 你需要这样
  • Google Maps API 3 - 在屏幕上显示所有标记,但保留中心点

    这非常类似于这个问题 https stackoverflow com questions 2818984 google map api v3 center zoom on displayed markers 我想确保所有标记都以当前缩放级别
  • 展开操作视图时导航抽屉图标(汉堡包和箭头)动画

    我在用着AppCompat and Toolbar 我确保当导航抽屉图标从汉堡包转变为箭头时会有动画 反之亦然 我使用以下技术https stackoverflow com a 26469738 72437 https stackoverf
  • 使用boost创建线程池

    是否可以使用boost的线程创建线程池 我正在查看 boost 的库 但找不到线程池管理器 或类似的东西 有办法做到吗 tnx 我知道答案已被接受 如果您现在需要这个 并且您懒得编写自己的线程池 您可以尝试使用带有并发提示的 boost a
  • Phoenix 频道:向特定客户端发送推送

    您好 我正在尝试使用 Elixir phoenix 重新实现 Whatsapp 功能 我在计算以下内容时遇到问题 如果聊天室中的所有人都收到了消息 我想向消息所有者发送 已收到 状态 以便他可以显示双勾号 但是 如何向某一特定客户端进行广播