Используя стандартную установку Erlang, каков минимальный код, необходимый для создания веб-сервера "Hello world"?
Как написать простой веб-сервер в Erlang?
Ответ 1
Принимая "производить" буквально, здесь довольно маленький. Он даже не читает запрос (но делает вилку по каждому запросу, поэтому это не так минимально возможно).
-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])).
Ответ 2
Для веб-сервера, использующего только встроенные библиотеки, проверьте inets http_server. Когда вы нуждаетесь в большей мощности, но все же с простотой, вы должны проверить библиотеку mochiweb. Вы можете использовать Google для загрузки кода примера.
Ответ 3
Вы действительно хотите написать веб-сервер в Erlang или хотите веб-сервер Erlang, чтобы вы могли создавать динамический веб-контент с помощью Erlang?
Если последнее, попробуйте YAWS. Если первый, посмотрите исходный код YAWS для вдохновения
Ответ 4
Для очень простого в использовании веб-сервера для создания полезных приложений или проверки поведения gen_webserver: http://github.com/martinjlogan/gen_web_server.
Ответ 5
Только одно исправление для ответа Феликса, и он рассматривает проблемы, которые видит Мартин. Перед закрытием сокета все данные, отправляемые от клиента, должны быть получены (например, do_recv
из gen_tcp description).
В противном случае существует условие гонки для браузера/прокси, отправляющего HTTP-запрос, достаточно быстро, чтобы отправить HTTP-запрос до закрытия сокета.