有没有人知道如何在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
获得更新。
思考?谢谢!
答案 0 :(得分:0)
我为我的Erlang彗星应用程序解决了这个问题,我在this blog post中展示了部分内容。基本上,您不希望套接字始终处于活动模式;在您阅读客户的请求之后和返回响应之前,您只需要它处于活动模式。
这是一个示例请求处理程序:
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模式下重用。