Как включить активные сокеты в приложении Mochiweb? - PullRequest
1 голос
/ 12 ноября 2009

Кто-нибудь знает, как включить активные вместо пассивных сокетов в приложении 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 только после того, как мне отправлено новое сообщение.

Мысли? Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2010

Я решил это для своего кометного приложения Erlang, части которого я покажу в этом блоге . По сути, вы не хотите, чтобы сокет находился в активном режиме все время; вы просто хотите активировать его после прочтения запроса клиента и перед возвратом ответа.

Вот пример обработчика запроса:

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.

...