1

有谁知道如何在 Mochiweb 应用程序中启用主动而不是被动套接字。具体来说,我正在尝试调整http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-2以便当客户端断开连接时,它将立即“注销”。

我试过设置:

start(Options) ->
    {DocRoot, Options1} = get_option(docroot, Options),
    Loop = fun (Req) ->
        Socket = Req:get(socket),
        inet:setopts(Socket, [{active, once}]),
        ?MODULE:loop(Req, DocRoot)
    end,

但这似乎不起作用。receive在我收到新消息后,我仍然只会收到更新。

想法?谢谢!

4

1 回答 1

0

我为我的 Erlang comet 应用程序解决了这个问题,我在这篇博文中展示了其中的一部分。基本上,您不希望套接字一直处于活动模式;您只希望在阅读客户的请求之后和返回响应之前它处于活动模式。

这是一个示例请求处理程序:

comet(Req) ->
    Body = Req:recv_body(),
    io:format("~nBody: ~p~n", [Body]),
    Socket = Req:get(socket),
    inet:setopts(Socket, [{active, once}]),
    Response = connection:handle_json(Body),
    inet:setopts(Socket, [{active, false}]),
    io:format("~nSending Response: ~s~n", [Response]),
    Req:ok({"application/json", [], Response}).

io:format 调用只是为了我的利益而进行控制台日志记录。重要的部分是我在从请求中读取正文之后并且在调用保存请求并返回数据的函数之前在套接字上设置了 {active, once} 。我还关闭了活动模式;套接字可以在某些 HTTP 模式下重用。

于 2010-02-24T00:58:02.987 回答