Как написать простой веб-сервер на Erlang? - PullRequest
29 голосов
/ 05 февраля 2010

При установке по умолчанию в Erlang, какой минимальный код необходим для создания веб-сервера, создающего Hello World?

Ответы [ 6 ]

50 голосов
/ 08 февраля 2010

В буквальном смысле слова "производим", вот довольно маленький. Он даже не читает запрос (но выполняет форк при каждом запросе, поэтому он не настолько минимально возможен).

-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])).
11 голосов
/ 05 февраля 2010

Для веб-сервера, использующего только встроенные библиотеки, проверьте inets http_server . Если вам нужно больше энергии, но все еще с простотой, вы должны проверить библиотеку mochiweb . Вы можете погуглить множество примеров кода.

7 голосов
/ 05 февраля 2010

Вы действительно хотите написать веб-сервер на Erlang или веб-сервер Erlang, чтобы вы могли создавать динамический веб-контент, используя Erlang?

Если последнее, попробуйте YAWS . Если первое, взгляните на исходный код YAWS для вдохновения

4 голосов
/ 26 февраля 2010

Для очень простого в использовании веб-сервера для создания успокаивающих приложений или тому подобного проверьте поведение gen_webserver: http://github.com/martinjlogan/gen_web_server.

2 голосов
/ 16 января 2018

Другой способ, похожий на пример 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 голос
/ 24 августа 2012

Только одно исправление для ответа Феликса, и оно касается проблем, которые видит Мартин. Перед закрытием сокета все данные, отправляемые клиентом, должны быть получены (например, с помощью do_recv из gen_tcp description ).

В противном случае возникает проблема, при которой браузер / прокси-сервер отправляет HTTP-запрос достаточно быстро, чтобы отправить http-запрос до закрытия сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...