web-dev-qa-db-ja.com

Erlangで簡単なウェブサーバーを書く方法は?

デフォルトのErlangインストールを使用して、「Helloworld」を生成するWebサーバーを生成するために必要な最小コードは何ですか?

32
Yazz.com

文字通り「プロデュース」を取ると、これはかなり小さいものです。リクエストを読み取ることすらしません(ただし、リクエストごとにフォークするため、可能な限り最小限ではありません)。

-module(hello).
-export([start/1]).

start(Port) ->
    spawn(fun () -> {ok, Sock} = gen_tcp:listen(Port, [{active, false}]), 
                    loop(Sock) end).

loop(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    Handler = spawn(fun () -> handle(Conn) end),
    gen_tcp:controlling_process(Conn, Handler),
    loop(Sock).

handle(Conn) ->
    gen_tcp:send(Conn, response("Hello World")),
    gen_tcp:close(Conn).

response(Str) ->
    B = iolist_to_binary(Str),
    iolist_to_binary(
      io_lib:fwrite(
         "HTTP/1.0 200 OK\nContent-Type: text/html\nContent-Length: ~p\n\n~s",
         [size(B), B])).
52
Felix Lange

組み込みライブラリのみを使用するWebサーバーの場合は、 inets http_server を確認してください。さらにパワーが必要であるが、それでも単純な場合は、 mochiweb ライブラリを確認する必要があります。あなたはサンプルコードの負荷のためにグーグルすることができます。

11
Jon Gretar

実際にErlangでWebサーバーを作成したいですか、それともErlangを使用して動的なWebコンテンツを作成できるようにErlang Webサーバーが必要ですか?

後者の場合は、 [〜#〜] yaws [〜#〜] を試してください。前者の場合は、 YAWSソースコード を見てインスピレーションを得てください

7
Paul Butcher

安らかなアプリなどを構築するための非常に使いやすいウェブサーバーについては、gen_webserverの動作を確認してください: http://github.com/martinjlogan/gen_web_server

4

上記のgen_tcpの例と同様ですが、コードが少なく、すでに提案として提供されている別の方法は、 inetsライブラリ を使用することです。

%%%
%%% A simple "Hello, world" server in the Erlang.
%%%

-module(hello_erlang).
-export([
  main/1,
  run_server/0,
  start/0
]).

main(_) ->
  start(),
  receive
    stop -> ok
  end.

run_server() ->
  ok = inets:start(),
  {ok, _} = inets:start(httpd, [
    {port, 0},
    {server_name, "hello_erlang"},
    {server_root, "/tmp"},
    {document_root, "/tmp"},
    {bind_address, "localhost"}
  ]).

start() -> run_server().                                                       

これにより、/tmpディレクトリが公開されることに注意してください。

実行するには、単純に:

$ escript ./hello_erlang.erl
3
spacez320

フェリックスの答えに対するたった1つの修正であり、マーティンが直面している問題に対処します。ソケットを閉じる前に、クライアントから送信されるすべてのデータを受信する必要があります(たとえば、do_recv from gen_tcp description )。

それ以外の場合、ソケットが閉じられる前にhttpリクエストを送信するのに十分な速さでHTTPリクエストを送信するブラウザ/プロキシの競合状態があります。

1
typingduck