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(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 に答える