如何使用牛仔将一个参数发送到websocket连接

时间:2013-08-07 11:07:10

标签: erlang websocket cowboy

在牛仔websocket例子中 在toppage_handler.erl

    handle(Req, State) ->
      {Echo, Req2} = cowboy_req:qs_val(<<"echo">>, Req),
      {ok, Req, State}.

我想让param Echo进入以下函数

例如:

本地主机:8080 /回声= 123

在ws_handler.erl

    websocket_init(_TransportName, Req, _Opts) ->
         %%How can I use the Echo(123) here?
         erlang:start_timer(1000, self(), <<"Hello!">>),
         {ok, Req, undefined_state}.

1 个答案:

答案 0 :(得分:0)

一个简单的解决方法是使用路径绑定:

在您的路线中:

Dispatch = cowboy_router:compile([
    %% {HostMatch, list({PathMatch, Handler, Opts})}
    {'_', [{"/echo/:echo", my_handler, []}]}
]),

然后在你的代码中:

{Echo, Req2} = cowboy_req(echo,Req)

最好在Websocket_handle中执行此操作,因为您可以将响应发送到套接字。在init中,你必须在你的状态下携带它,如下所示:

websocket_init(_TransportName, Req, _Opts) ->
    {Echo, Req2} = cowboy_req:binding(echo,Req),
    erlang:start_timer(1000, self(), <<"Hello!">>),
    {ok, Req2, {Echo}}.

websocket_handle(_Frame, Req, {Echo}) ->
    {reply, {text, Echo}, Req, State}.

由于websocket旨在处理长期连接,我使用这样的绑定来支持信道,用户ID等信息。但不是像“echo”中的数据,因为你想要发送多个不同的文本来回声而不关闭并且每次只是为了更改URL而重新打开websocket连接。