Utilizando la instalación predeterminada de Erlang, ¿cuál es el código mínimo necesario para producir un servidor web productor de "Hello World"?¿Cómo escribir un servidor web simple en Erlang?
Respuesta
Tomando "producir" literalmente, aquí hay uno bastante pequeño. Ni siquiera lee la solicitud (pero sirve para cada solicitud, por lo que no es lo mínimo posible).
-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])).
Consulte '{packet, http}' para 'Opciones' de' gen_tcp: listen' para decodificar encabezados HTTP. – Pindatjuh
Estaba viendo este código, y aunque parece limpio, encontré un problema. Al probarlo con Apache Bench, obtengo un 'apr_socket_recv: Connection reset by peer (104)'. funciona bien cuando se accede desde un navegador o usando curl. ¿Tienes alguna idea de por qué es esto? –
@MartinKristiansen Eliminar la línea 'gen_tcp: cerrar (Conn) .' –
¿De verdad quieres escribir un servidor web en Erlang, o quieres un servidor web Erlang para poder crear contenido web dinámico usando Erlang?
Si es el último, intente YAWS. Si es el primero, eche un vistazo al YAWS source code para obtener inspiración
Quiero crear contenido dinámico, pero solo quería saber el mínimo indispensable para un servidor web. Miré el código fuente de Yaws y mi primera impresión fue que se necesitaba mucho código. – Zubair
Para un servidor web que utiliza únicamente las bibliotecas integradas, echa un vistazo a inets http_server. Cuando necesite un poco más de potencia pero aún con simplicidad, debe consultar la biblioteca mochiweb. Puedes google para un montón de código de ejemplo.
Eso es genial, así que al usar INets ¿puedo escribir un servidor web de un solo módulo? – Zubair
Para un muy fácil de usar servidor web para la creación de aplicaciones de descanso o como revisar el comportamiento gen_webserver: http://github.com/martinjlogan/gen_web_server.
Solo una solución para la respuesta de Felix y aborda los problemas que está viendo Martin. Antes de cerrar un socket, se deben recibir todos los datos que se envían desde el cliente (utilizando, por ejemplo, do_recv
desde gen_tcp description).
De lo contrario, hay una condición de carrera para que el navegador/proxy envíe la solicitud HTTP lo suficientemente rápido como para enviar la solicitud http antes de que se cierre el socket.
Otra forma, similar al ejemplo anterior gen_tcp
pero con menos código y ya se ofrece como sugerencia, es usar el 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().
Tenga en cuenta, esto expone su directorio /tmp
.
para correr, simplemente:
$ escript ./hello_erlang.erl
- 1. Escribir un servidor web simple en Ruby
- 2. Cómo escribir un servidor HTTP simple en Haskell usando Network.HTTP.receiveHTTP
- 3. Problema de servidor simple de Erlang
- 4. ¿Servidor web simple en C++?
- 5. ¿Cómo escribir un depurador simple?
- 6. Escribir archivo en el servidor web - ASP.NET
- 7. Cómo escribir un servidor basado en REST simple en C# en mono?
- 8. ¿Cómo escribir un servidor proxy en Python?
- 9. un servidor smtp simple
- 10. ¿Cómo escribir un compilador simple en C/++?
- 11. Escribir un analizador simple
- 12. Erlang leer stdin escribir stdout
- 13. ¿Cómo manejo cargas de archivos muy grandes en un servidor web Erlang?
- 14. Cómo escribir macro (simple)?
- 15. Servicios web SOAP en erlang
- 16. ¿Cómo escribir un simple Makefile jerárquico?
- 17. ¿Cómo escribir un controlador usb simple?
- 18. ejemplo simple para Erlang memoization
- 19. Cómo escribir funciones de lista nativas de Erlang en CouchDB
- 20. Servidor web CGI simple en Python en VMS
- 21. ¿Servidor multiproceso simple en C++?
- 22. C# Cómo hacer un simple servidor UDP
- 23. ¿Cómo alojar un sitio web JSP en un servidor web?
- 24. Cómo escribir pruebas unitarias en C simple?
- 25. ¿Cómo escribir una clase simple en C++?
- 26. Un simple servidor local SMTP
- 27. guía para escribir especificaciones en Erlang
- 28. ¿Cómo se puede escribir un editor WYSIWYG simple en JavaScript?
- 29. Cómo proteger un servidor web DE un servidor proxy inverso
- 30. Servidor DNS muy simple
Como esto es diferente de http://stackoverflow.com/questions/2084639/sinatra-style-web-framework-for-erlang? – Zed
@Zed, Zubair está pidiendo un servidor "hello world" mínimo: tiene una sola "página" porque es mínima. La pregunta a la que se ha vinculado pregunta cómo hacer una aplicación web funcional (de una página, pero responde a una variedad de solicitudes de diferentes maneras). Supongo que este último será ajax-y. – apollodude217