Mochiweb是一个框架,在你用它来生成一个你"指定名字(Name)"项目前(下载源码,然后这样来生成你的项目:make app PROJECT=project_name PREFIX=$HOME/projects/),它是什么都不做的。
假设你生成的是name项目。
就会在你的项目里自动生成下面的文件:name.erl, name_app.erl, name_sup.erl, name_deps.erl, name.app等
然后入口在,你的name.erl的start/0,然后里面最后会调用application:start(name)。就是会用这个配置文件:name.app,启动整个项目(标准的OTP gen_server框架:name.app, name_app.erl, name_sup.erl, name_web.erl)。然后,就是name_app.erl,然后再是name_sup.erl(在这里可以配置你的mochiweb server的参数,例如,IP,Port等)。然后就是name_web.erl。
然后,你的逻辑就加在name_web.erl里面的loop/2里面。当一个接到一个请求,loop/2就会被执行一次。
其实,在name_web.erl里面,第一个被调用的fun是start/1。这里就是mochiweb自己的入口。
start(Options) ->
{DocRoot, Options1} = get_option(docroot, Options),
Loop = fun (Req) ->
?MODULE:loop(Req, DocRoot)
end,
mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]).
这里把name_web.erl的loop当一个Param传给mochiweb_http。
-define(DEFAULTS, [{name, ?MODULE},
{port, 8888}]).
parse_options(Options) ->
{loop, HttpLoop} = proplists:lookup(loop, Options),
Loop = fun (S) ->
?MODULE:loop(S, HttpLoop)
end,
Options1 = [{loop, Loop} | proplists:delete(loop, Options)],
mochilists:set_defaults(?DEFAULTS, Options1). %%看看,DEFAULT的属性Options1里有没有,没有的话就设置成DEFAULT,有就保留原样。
...
start() ->
start([{ip, "127.0.0.1"},
{loop, {?MODULE, default_body}}]).
start(Options) ->
mochiweb_socket_server:start(parse_options(Options)).
然后,就是mochiweb_socket_server了。又是一个OTP的gen_server(所以才叫socket_server)。先调用start/1,然后就是start_server/1
-record(mochiweb_socket_server,
{port,
loop,
name=undefined,
%% NOTE: This is currently ignored.
max=2048,
ip=any,
listen=null,
nodelay=false,
backlog=128,
active_sockets=0,
acceptor_pool_size=16,
ssl=false,
ssl_opts=[{ssl_imp, new}],
acceptor_pool=sets:new()}).
start(State=#mochiweb_socket_server{}) ->
start_server(State);
start(Options) ->
start(parse_options(Options)).
...
start_server(State=#mochiweb_socket_server{ssl=Ssl, name=Name}) ->
case Ssl of
true ->
application:start(crypto),
application:start(ssl);
false ->
void
end,
case Name of
undefined ->
gen_server:start_link(?MODULE, State, []);
_ ->
gen_server:start_link(Name, ?MODULE, State, [])
end.
注意了,从name_sup.erl调用开始,一直都是函数调用,在start_server/1里面,调用gen_server:start_link/3or/4后,这个叫Name的gen_server就成为supervisor name_sup的一个worker了!
哈哈,大家知道这个时候Name里面是什么吗?在默认的情况下?
………………
恩恩,聪明的同学已经看到了,就是"name_web"。这里mochiweb框架很好地嫁接了,项目的处理逻辑和本身mochiweb的supervisor-worker的关系。
今天累了,以后有时间继续……
分享到:
相关推荐
在Erlang中,我们可以创建一个名为`mochiweb_server.erl`的模块,其中包含以下代码: ```erlang -module(mochiweb_server). -export([start/0, loop/1]). start() -> Port = 8000, % 设置监听端口 mochiweb_...
- **源代码文件**:通常会有 `.erl` 扩展名的 Erlang 源代码文件,它们包含了使用 Mochiweb 构建的 Web 应用或测试程序的实现。 - `mochiweb_server.erl` 可能是实现 Mochiweb 服务器逻辑的模块。 - `request_...
MochiWeb 的最新版本可在MochiWeb 的邮件列表位于 设置 MochiWeb 环境需要 Erlang OTP,可在使用项目创建一个新的 mochiweb:make app PROJECT=project_name 要使用特定目录中的项目创建新的 mochiweb: make app ...
**基于Mochiweb的聊天室** 在信息技术领域,构建实时通信系统,如聊天室,是常见的需求。这里我们探讨的是一个使用Erlang编程语言和Mochiweb框架实现的聊天室。Erlang是一种面向并发、分布式计算的语言,因其在处理...
MochiWeb的邮件列表位于 R12B兼容性:MochiWeb的母版已通过R14A及更高版本进行了测试。 与R12B兼容的分支在单独维护。为方便起见,该存储库的R12B分支有时会在官方存储库中进行镜像。 要使用项目创建新的mochiweb,...
- **热更新**:Erlang支持代码的热更新,可以在不中断服务的情况下更新应用程序,提高了系统的可用性。 - **轻量级**:Mochiweb和Cowboy都设计为轻量级,启动快速,资源占用少,适合部署在资源有限的环境中。 总的...
我已经决定不将工具本身捆绑在源代码树中,但是很容易从[rebar项目站点] [rebar3]中获得它(不要忘了使其可执行)。 Rebar可以获取依赖项,立即编译所有内容,甚至安装: rebar3 compile (注意:以Makefile为例...
- `srv`: 存放Erlang源代码文件。 - `ebin`: 编译后的Erlang目标码文件及`.app`文件。 - `priv`: 存放项目私有的文件,如C代码、专用数据文件等。 - `include`: 存放头文件。 - `test`: 测试脚本。 - **依赖...
- **srv**:存放Erlang源代码文件(.erl 和 .hrl)。 - **ebin**:编译后的Erlang目标文件(.beam)及应用程序配置文件(.app)。 - **priv**:存储项目特定的文件,如C语言代码、专有数据等。可以通过`code:priv_...
Webmachine 是一个应用层,为 mochiweb 提供 HTTP 语义的特性,定义一个简单而清晰的连接应用的方式。 标签:Webmachine Web框架
它目前支持Cowboy,Inet,Mochiweb,Webmachine和Yaws。 SimpleBridge用作两个最受欢迎的Erlang Web框架到Web服务器的桥梁: 和 从某种意义上讲,它类似于 ,除了具有一些关键的改进/不同之处: 轻松扩展-需要...
在建立一个 Erlang 工程项目时,需要首先安装 Erlang 和 Git 代码管理系统。在 Ubuntu 10.04 下,可以使用以下命令安装 Erlang 和 Git: ``` $ sudo apt-get install erlang $ sudo apt-get install git-core ``` ...
erlang + delphi demo with Web UI`可能是通过Web界面展示Erlang和Delphi的集成,这可能使用了Erlang的Web开发框架,如Yaws或Mochiweb,与Delphi后端进行交互。 - `12. erlang demo with hot update`可能展示了...
Erlang的代码质量受到严格的控制,通过cover工具可以实现100%的代码覆盖率,从而确保高可靠性。此外,扩展Erlang应用非常容易,通过添加更多的CPU,性能可以线性增长。 Erlang的分布式和集群特性使其在大规模系统中...
4. Mochiweb - 用于构建高效的Web服务器和HTTP客户端的Erlang库 5. Disco - 分布式计算框架 **Erlang 与操作系统的比较** Erlang 采用函数式编程范式,与传统的Unix操作系统(通常使用C++)有所不同。在Erlang中,...
在上述代码中,我们看到的是一个简单的Erlang Web服务器实现,名为`httpd.erl`。这个服务器可以接收HTTP请求,并根据请求返回静态文件。 1. **模块定义与导出**: 模块名为`httpd`,作者为`ninhenry@gmail.com`。...
核心功能目的:高性能协议中继端点:WebSocket,MQTT,TCP 代码库:700 LOC(Erlang),500 LOC(JavaScript) 透析仪:REBAR,REBAR3,MAD,MIX 主机:COWBOY,EMQ,MOCHIWEB,RING,TCP,UDP协议扩展模板:DTL,...
2. **Erlang实现Websocket**:在Erlang中,可以使用如`cowboy`或`mochiweb`这样的Web框架来处理Websocket连接。它们提供了方便的中间件,使得在Erlang进程中直接处理Websocket连接成为可能。例如,`cowboy`中的`...
heroku-genfsmAn experimental Erlang app which deployed on HerokuSome Deploy Detail在 Heroku 上部署 Webmachine + Mochiweb + ErlyDTL 组合的 Erlang Web 应用