デフォルトのErlangインストールを使用して、「Helloworld」を生成するWebサーバーを生成するために必要な最小コードは何ですか?
文字通り「プロデュース」を取ると、これはかなり小さいものです。リクエストを読み取ることすらしません(ただし、リクエストごとにフォークするため、可能な限り最小限ではありません)。
-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])).
組み込みライブラリのみを使用するWebサーバーの場合は、 inets http_server を確認してください。さらにパワーが必要であるが、それでも単純な場合は、 mochiweb ライブラリを確認する必要があります。あなたはサンプルコードの負荷のためにグーグルすることができます。
実際にErlangでWebサーバーを作成したいですか、それともErlangを使用して動的なWebコンテンツを作成できるようにErlang Webサーバーが必要ですか?
後者の場合は、 [〜#〜] yaws [〜#〜] を試してください。前者の場合は、 YAWSソースコード を見てインスピレーションを得てください
安らかなアプリなどを構築するための非常に使いやすいウェブサーバーについては、gen_webserverの動作を確認してください: http://github.com/martinjlogan/gen_web_server 。
上記の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
フェリックスの答えに対するたった1つの修正であり、マーティンが直面している問題に対処します。ソケットを閉じる前に、クライアントから送信されるすべてのデータを受信する必要があります(たとえば、do_recv
from gen_tcp description )。
それ以外の場合、ソケットが閉じられる前にhttpリクエストを送信するのに十分な速さでHTTPリクエストを送信するブラウザ/プロキシの競合状態があります。