Cowboy中http处理程序和websocket处理程序之间的通信

Cowboy中http处理程序和websocket处理程序之间的通信,websocket,erlang,cowboy,Websocket,Erlang,Cowboy,我想在Cowboy中创建一个websocket应用程序,从另一个Cowboy处理程序获取数据。假设我想结合cowboy的Echo_get示例: 以websocket为例 在该示例中,对Echo的GET请求应该通过websocket处理程序向html页面发送“推送” 最简单的方法是什么?我可以简单地使用“管道”操作符吗?我是否需要创建和中介gen_东西来在它们之间传递消息?我希望您能给出一个示例代码,其中显示了处理程序的粘合代码——我真的不知道从哪里开始将两个处理程序连接在一起。cowboy中的

我想在Cowboy中创建一个websocket应用程序,从另一个Cowboy处理程序获取数据。假设我想结合cowboy的Echo_get示例:

以websocket为例

在该示例中,对Echo的GET请求应该通过websocket处理程序向html页面发送“推送”


最简单的方法是什么?我可以简单地使用“管道”操作符吗?我是否需要创建和中介gen_东西来在它们之间传递消息?我希望您能给出一个示例代码,其中显示了处理程序的粘合代码——我真的不知道从哪里开始将两个处理程序连接在一起。

cowboy中的websocket处理程序是一个长期存在的请求过程,您可以向其发送websocket或erlang消息

在您的案例中,有两种类型的流程:

  • websocket进程:具有向客户端打开的websocket连接的websocket处理程序
  • echo进程:客户端使用参数访问echo处理程序时的进程
其思想是echo进程向websocket进程发送一条erlang消息,而websocket进程又将向客户端发送一条消息

由于回送进程可以向websocket进程发送消息,因此需要保留要向其发送消息的websocket进程的列表。是一个非常有用的图书馆

您可以将进程注册到
gproc\u ps:subscribe/2
,并使用
gproc\u ps:publish/3
向已注册的进程发送消息

Cowboy websocket进程使用函数接收erlang消息

例如,websocket处理程序可以如下所示:

websocket_init(_, Req, _Opts) ->
  ...
  % l is for local process registration
  % echo is the name of the event you register the process to
  gproc_ps:subscribe(l, echo),
  ...

websocket_info({gproc_ps_event, echo, Echo}, Req, State) ->
  % sending the Echo to the client
  {reply, {text, Echo}, Req, State};
echo(<<"GET">>, Echo, Req) ->
    % sending the echo message to the websockets handlers
    gproc_ps:publish(l, echo, Echo),
    cowboy_req:reply(200, [
        {<<"content-type">>, <<"text/plain; charset=utf-8">>}
    ], Echo, Req);
回声处理器如下所示:

websocket_init(_, Req, _Opts) ->
  ...
  % l is for local process registration
  % echo is the name of the event you register the process to
  gproc_ps:subscribe(l, echo),
  ...

websocket_info({gproc_ps_event, echo, Echo}, Req, State) ->
  % sending the Echo to the client
  {reply, {text, Echo}, Req, State};
echo(<<"GET">>, Echo, Req) ->
    % sending the echo message to the websockets handlers
    gproc_ps:publish(l, echo, Echo),
    cowboy_req:reply(200, [
        {<<"content-type">>, <<"text/plain; charset=utf-8">>}
    ], Echo, Req);
echo(,echo,Req)->
%将回显消息发送到websockets处理程序
gproc_ps:发布(l,echo,echo),
牛仔要求:答复(200[
{, }
],Echo,Req);

刚刚经过测试,它可以正常工作!谢谢!您知道与erlang中可用的其他方法相比,该方法是否有任何显著的性能或可伸缩性缺陷(例如,如果pub和sub在不同的机器上,等等)?将我自己的用于oub/sub的gen_服务器置于echo和websocket处理程序之间是否比gproc更高效/可扩展?我试图了解我是否可以坚持使用gproc来完成一个项目,而不仅仅是一个宠物项目(在发布/订阅线路上进行重要的沟通(高发布/订阅率和节点数量)。