Подтвердить что ты не робот

Как написать простой веб-сервер в Erlang?

Используя стандартную установку Erlang, каков минимальный код, необходимый для создания веб-сервера "Hello world"?

4b9b3361

Ответ 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-запрос до закрытия сокета.