如何在 Erlang 中编写一个简单的网络服务器?
使用默认的 Erlang 安装来生成“Hello world”的 Web 服务器所需的最少代码是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
使用默认的 Erlang 安装来生成“Hello world”的 Web 服务器所需的最少代码是什么?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
对于仅使用内置库的 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.
另一种方法与上面的 gen_tcp 示例类似,但代码较少,并且已作为建议提供,即使用 inets 库。
请记住,这会公开您的
/tmp
目录。要运行,只需:
Another way, similar to the
gen_tcp
example above but with less code and already offered as a suggestion, is using the inets library.Keep in mind, this exposes your
/tmp
directory.To run, simply:
您是否真的想用 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
对于一个非常易于使用的网络服务器来构建宁静的应用程序或类似的检查 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.
只需对菲利克斯的答案进行一处修复即可解决马丁所看到的问题。在关闭套接字之前,应接收从客户端发送的所有数据(例如使用来自 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.
从字面上看“生产”,这是一个相当小的产品。它甚至不读取请求(但会分叉每个请求,因此它不是尽可能少的)。
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).