我想在Cowboy中创建一个websocket应用程序,从另一个Cowboy处理程序获取数据。让我们说我想要结合牛仔的Echo_get示例:https://github.com/ninenines/cowboy/tree/master/examples/echo_get/src
使用websocket示例
https://github.com/ninenines/cowboy/tree/master/examples/websocket/src
以这种方式对Echo的GET请求应该发送" push"通过websocket处理程序到该示例中的html页面。
最简单的方法是什么?我可以使用" pipe"操作员以一些简单的方式?我是否需要创建和中间gen_something以在它们之间传递消息?我希望得到一个示例代码的答案,显示处理程序的粘合代码 - 我真的不知道从哪里开始将两个处理程序连接在一起。
答案 0 :(得分:6)
牛仔中的websocket处理程序是一个长期存在的请求进程,您可以向其发送websocket或erlang消息。
在您的情况下,有两种类型的流程:
这个想法是echo进程向websocket进程发送一条erlang消息,然后又向客户端发送消息。
对于echo进程可以向websocket进程发送消息,您需要保留要向其发送消息的websocket进程列表。 Gproc是一个非常有用的图书馆。
您可以使用gproc_ps:subscribe/2
向gproc pubsub注册流程,并使用gproc_ps:publish/3
向已注册的流程发送消息。
Cowboy websocket进程使用websocket_info/3函数接收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);