Используя установку по умолчанию Erlang, каков минимальный код, необходимый для создания веб-сервера «Hello world»?Как написать простой веб-сервер в Erlang?
ответ
Принимая «производить» буквально, здесь довольно маленький. Он даже не читает запрос (но делает вилку по каждому запросу, поэтому это не так минимально возможно).
-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])).
См. '{Пакет, http}' '' '' '' gen_tcp: listen' для декодирования HTTP-заголовков. – Pindatjuh
Я смотрел этот код, и хотя он выглядит чистым, я нашел проблему. При тестировании с помощью Apache Bench я получаю сообщение apr_socket_recv: Connection reset by peer (104) '. он отлично работает при доступе в браузере или с помощью завитки. У вас есть идеи, почему это так? –
@MartinKristiansen Удалить строку 'gen_tcp: close (Conn) .' –
Вы действительно хотите написать веб-сервер в Erlang или хотите веб-сервер Erlang, чтобы вы могли создавать динамический веб-контент с помощью Erlang?
Если последний, попробуйте YAWS. Если первый, посмотрите на YAWS source code для вдохновения
Я хочу сделать динамический контент, но просто хочу знать минимальный минимум, необходимый для веб-сервера. Я посмотрел исходный код Yaws, и мое первое впечатление заключалось в том, что требуется много кода. – Zubair
Для веб-сервера, использующего только встроенные библиотеки, обращайтесь к inets http_server. Если вам нужна дополнительная мощность, но с простотой, вы должны проверить библиотеку mochiweb. Вы можете использовать Google для загрузки кода примера.
Это здорово, поэтому с помощью INets я могу написать веб-сервер с одним модулем? – Zubair
Для очень простой в использовании веб-сервера для создания успокоительные приложений или такой проверить поведение gen_webserver: http://github.com/martinjlogan/gen_web_server.
Только одно исправление для ответа Феликса, и оно рассматривает проблемы, которые видит Мартин. Перед закрытием сокета должны быть получены все данные, отправляемые от клиента (с использованием, например, do_recv
от gen_tcp description).
В противном случае существует условие гонки для браузера/прокси, отправляющего HTTP-запрос достаточно быстро, чтобы отправить HTTP-запрос до закрытия сокета.
Другой способ, аналогичный приведенному выше примеру gen_tcp
, но с меньшим количеством кода и уже предлагаемый в качестве предложения, использует inets library.
%%%
%%% 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. Как написать простой цикл приема в Erlang
- 2. Отладка простой программы в Erlang
- 3. Как я могу написать симуляции в Erlang?
- 4. Как написать простой Html.DropDownListFor()?
- 5. Java Вебсервер не отвечает
- 6. Как написать (простой) макрос?
- 7. Erlang читать stdin написать stdout
- 8. Доступ Docker Контейнер Вебсервер
- 9. разрешений приложений Вебсервер выпуск
- 10. апач-вебсервер-сайт издательства
- 11. Вебсервер не перезаписывает файл
- 12. Простой пример для Erlang запоминанием
- 13. Как написать простой псевдо-ассемблер?
- 14. Как написать простой экземпляр Silverlight?
- 15. Как написать простой USB-драйвер?
- 16. Как написать простой клиент SSH?
- 17. Как написать простой перехватчик ошибок?
- 18. Как написать простой сервер SMPP
- 19. Как написать простой честный семафор?
- 20. не может порождать простой сервер в Erlang
- 21. Как написать простой честный замок?
- 22. Определить вебсервер & Script веб-сайта
- 23. VertX Вебсервер статический контент Webroot
- 24. Запуск и остановки проглатывать-вебсервер
- 25. Вебсервер не открывает файлы включают%
- 26. Простой мод написать
- 27. Как написать простой фоновый поток в CWorkerThread
- 28. Как написать простой класс в C++?
- 29. Как написать модульные тесты в простой C?
- 30. Как написать простой графический интерпретатор в C#?
Как это отличается от http://stackoverflow.com/questions/2084639/sinatra-style-web-framework-for-erlang? – Zed
@ Zed, Zubair просит минимальный сервер «привет мир» - у него есть одна «страница», потому что она минимальна. Вопрос, который вы связали, задает вопрос о том, как создать функциональное веб-приложение (одностраничное, но реагирует на различные запросы по-разному). Я предполагаю, что последний будет ajax-y. – apollodude217