如何在 Erlang 中编写一个简单的网络服务器?

发布于 2024-08-20 01:05:14 字数 58 浏览 2 评论 0 原文

使用默认的 Erlang 安装来生成“Hello world”的 Web 服务器所需的最少代码是什么?

Using the default Erlang installation what is the minimum code needed to produce a "Hello world" producing web server?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

懒猫 2024-08-27 01:05:15

对于仅使用内置库的 Web 服务器,请查看 inets http_server
当需要更多功能但仍然简单时,您应该查看 mochiweb 库。您可以通过谷歌搜索大量示例代码。

For a web server using only the built in libraries check out inets http_server.
When in need of some more power but still with simplicity you should check out the mochiweb library. You can google for loads of example code.

你好,陌生人 2024-08-27 01:05:15

另一种方法与上面的 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

Another way, similar to the gen_tcp example above but with less code and already offered as a suggestion, is using the 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().                                                       

Keep in mind, this exposes your /tmp directory.

To run, simply:

$ escript ./hello_erlang.erl
拧巴小姐 2024-08-27 01:05:15

您是否真的想用 Erlang 编写一个 Web 服务器,或者您想要一个 Erlang Web 服务器以便您可以使用 Erlang 创建动态 Web 内容?

如果是后者,请尝试 YAWS。如果是前者,请查看YAWS 源代码以获取灵感

Do you actually want to write a web server in Erlang, or do you want an Erlang web server so that you can create dynamic web content using Erlang?

If the latter, try YAWS. If the former, have a look at the YAWS source code for inspiration

情仇皆在手 2024-08-27 01:05:15

对于一个非常易于使用的网络服务器来构建宁静的应用程序或类似的检查 gen_webserver 行为: http://github.com/ martinjlogan/gen_web_server

For a very easy to use webserver for building restful apps or such check out the gen_webserver behaviour: http://github.com/martinjlogan/gen_web_server.

无法言说的痛 2024-08-27 01:05:15

只需对菲利克斯的答案进行一处修复即可解决马丁所看到的问题。在关闭套接字之前,应接收从客户端发送的所有数据(例如使用来自 gen_tcp 描述)。

否则,浏览器/代理发送 HTTP 请求的速度足以在套接字关闭之前发送 http 请求,从而存在竞争条件。

Just one fix for Felix's answer and it addresses the issues Martin is seeing. Before closing a socket, all data being sent from the client should be received (using for example do_recv from gen_tcp description).

Otherwise there's a race condition for the browser/proxy sending the HTTP request being quick enough to send the http request before the socket is closed.

白色秋天 2024-08-27 01:05:14

从字面上看“生产”,这是一个相当小的产品。它甚至不读取请求(但会分叉每个请求,因此它不是尽可能少的)。

-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])).

Taking "produce" literally, here is a pretty small one. It doesn't even read the request (but does fork on every request, so it's not as minimal possible).

-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])).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文