gpt4 book ai didi

erlang - 如何使用 Cowboy 通过 websocket 异步发送数据?

转载 作者:行者123 更新时间:2023-12-04 18:13:33 28 4
gpt4 key购买 nike

我有一个 Cowboy websocket 服务器,我想注册一个 gen_event通过 websocket 发送内容的处理程序。我还需要能够使用 websocket_handle/3 回复常规同步请求.我在 cowboy_http_websocket_handler.erl 中没有看到任何明显的内容和 cowboy_http_websocket:websocket_send/3不导出。我是否错过了通过打开的套接字发送内容的简单方法?

最佳答案

@nmichaels 的回答为我指明了正确的方向,我在牛仔应用程序中成功使用 gen_event 将内部消息发送到 websocket_info。但是答案有点过时了,牛仔已经发生了很大变化,所以我想补充一下,并提供一个适用于最新牛仔版本的解决方案。希望这会帮助一些刚接触 Erlang 和牛仔的人。

在牛仔中实现 gen_event 需要三个步骤

  • 启动 gen_event 并注册你的处理程序
    start(_Type, _Args) ->
    Dispatch = cowboy_router:compile(wrinqle_routes:routes_configuration()),
    {ok, _} = cowboy:start_http(http, 100, [{port, 3000}],
    [{env, [{dispatch, Dispatch}]}]),
    pg2:start(),

    gen_event:start({global,my_events}),
    gen_event:add_handler({global,my_events},my_event_handler,[]).

  • 在这里,我已经在全局注册了名为 my_events 的事件(注意:您也可以在本地注册事件)并在模块 my_event_handler 中添加了处理程序
  • 创建一个事件处理程序。
  • 现在您可以从牛仔的任何地方通知您的事件处理程序。例如,下面的代码从 websocket_handler 引发事件
    { _,_ }->

    gen_event: notify(global:whereis_name(my_events),{event_name,self()}),
    {ok,Req,State};

  • 这段代码所做的只是将事件通知在 my_events 下注册的事件。就是这样。

    OP 遇到的另一个问题是如何向打开的连接和初始化时 pid 未知的连接发送消息。要解决此问题,您可以使用 pg2它在 channel 下注册进程ID。它是管理 PID 的一个非常有用的模块。所以上面的代码可以转换成这样的
      [H|T] = pg2:get_members(Name)
    gen_event: notify(global:whereis_name(my_events),{event_name, H}).

    通过这种方式,您可以将消息发送到特定的 pid 并通过扩展发送到特定的套接字。

    关于erlang - 如何使用 Cowboy 通过 websocket 异步发送数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8136996/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com