启动创建好的skeleton时,skel.erl调用application:start(),根据skel.app,启动skel_sup.erl 的supervisor,规格
%% @spec init([]) -> SupervisorTree
%% @doc supervisor callback.
init([]) ->
Ip = case os:getenv("MOCHIWEB_IP") of false -> "0.0.0.0"; Any -> Any end,
WebConfig = [
{ip, Ip},
{port, 8000},
{docroot, skel_deps:local_path(["priv", "www"])}],
Web = {skel_web,
{skel_web, start, [WebConfig]},
permanent, 5000, worker, dynamic},
Processes = [Web],
{ok, {{one_for_one, 10, 10}, Processes}}.
调用了skel_web:start([{ip,Ip},{port,8000},{docroot,"....priv/www"}])这个gen_server
start(Options) ->
{DocRoot, Options1} = get_option(docroot, Options),
Loop = fun (Req) ->
?MODULE:loop(Req, DocRoot)
end,
mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]).
get_option后得到的是 {"....priv/www",[{ip,Ip},{port,8000}]}
Loop保存了当前模块的一个回调函数(有点类似与保存一个函数指针到变量,用于回调)
然后调用了 mochiweb_http:start([...]),传入的proplist 又增加了
{name, ?MODULE}, {loop, Loop} 这两项
start(Options) ->
mochiweb_socket_server:start(parse_options(Options)).
parse_options(Options) ->
{loop, HttpLoop} = proplists:lookup(loop, Options),
Loop = fun (S) ->
?MODULE:loop(S, HttpLoop)
end,
Options1 = [{loop, Loop} | proplists:delete(loop, Options)],
%%上面3行,是取出传入的回调函数,然后又封装了一下,变成调用本模块的
%%loop函数,已之前保存的函数指针HttpLoop 为参数,并替换调list里面原来的那个
%%Loop函数指针
set_defaults(?DEFAULTS, Options1).
%%set_defaults将预定义的一些参数添加到list中,如果里面没有定义,对于默认情况
%%就是现在的例子,这行代码等于没有,因为之前已经定义了name和port
set_default({Prop, Value}, PropList) ->
case proplists:is_defined(Prop, PropList) of
true ->
PropList;
false ->
[{Prop, Value} | PropList]
end.
set_defaults(Defaults, PropList) ->
lists:foldl(fun set_default/2, PropList, Defaults).
-define(DEFAULTS, [{name, ?MODULE},
{port, 8888}]).
启动 mochiweb_socket_server,传入的仍是一个list
这个list里存放了 ip:port 以及当前模块的一个回调函数指针,回调这个
loop(Socket, Body) ->
inet:setopts(Socket, [{packet, http}]),
request(Socket, Body).
mochiweb_socket_server
先调用这个
start(Options) ->
start(parse_options(Options)).
然后调用了这个
start(State=#mochiweb_socket_server{}) ->
start_server(State);
parse_options将传入的list,按指定格式存放到record中
-record(mochiweb_socket_server,
{port,
loop,
name=undefined,
max=2048,
ip=any,
listen=null,
acceptor=null,
backlog=30}).
分享到:
相关推荐
2. **Mochiweb_Socket**:提供了一种低级别的接口来处理网络套接字,用于与客户端建立和维护TCP连接。 3. **Mochiweb回应(Response)**:Mochiweb提供了一个结构体来构建HTTP响应,包括状态码、响应头和响应体。你...
2. **Web 服务器进程模型**:Mochiweb 使用 Erlang 的进程模型来处理每个连接,这使得它非常适合处理高并发场景。每个连接都被分配到一个独立的进程,保证了请求之间的隔离,同时也易于实现并发处理。 3. **HTTP ...
MochiWeb 的最新版本可在MochiWeb 的邮件列表位于 设置 MochiWeb 环境需要 Erlang OTP,可在使用项目创建一个新的 mochiweb:make app PROJECT=project_name 要使用特定目录中的项目创建新的 mochiweb: make app ...
通过学习和分析这个项目,开发者可以深入理解Erlang的并发模型、Mochiweb的工作原理,以及如何利用它们构建高效、可靠的Web服务。同时,这也为扩展到更复杂的实时应用,如协作工具、游戏服务器等,提供了基础。
MochiWeb的邮件列表位于 R12B兼容性:MochiWeb的母版已通过R14A及更高版本进行了测试。 与R12B兼容的分支在单独维护。为方便起见,该存储库的R12B分支有时会在官方存储库中进行镜像。 要使用项目创建新的mochiweb,...
描述中的“erlang web frame”可能指的是Erlang生态系统中的多个Web框架,其中包括了Mochiweb和Cowboy这两个著名的名字。它们都是轻量级、高性能的HTTP服务器实现,常被用作构建Web应用的基础。 1. **Mochiweb**:...
RPSSL-Rock-Paper-Scissors-Spock-Lizard是一款简单但着名的2人游戏。 通常,它是第一人称自己玩的,但这是网络版本。 Web版本使用,该是运行时间很长的HTTP请求,可用于将服务器立即将数据推送到客户端。 每个...
### Erlang实战IP查询服务知识点解析 #### 一、项目背景与目标 - **项目名称**: Erlang实战IP查询服务 ...对于有兴趣学习Erlang或者希望深入了解其在网络编程中的应用的开发者来说,这是一个非常有价值的实践案例。
使用 rebar 工具开发 Erlang 工程项目和发布 Erlang 工程项目学习 本文主要介绍了使用 rebar 工具开发 Erlang 工程项目和发布 Erlang 工程项目的方法。rebar 是一个 Erlang 构建工具,可以方便的编译测试 Erlang ...
2. **Erlang实现Websocket**:在Erlang中,可以使用如`cowboy`或`mochiweb`这样的Web框架来处理Websocket连接。它们提供了方便的中间件,使得在Erlang进程中直接处理Websocket连接成为可能。例如,`cowboy`中的`...
### mql超级详细学习文档 #### 一、MQ配置与安装步骤 MQ(Message Queue,消息队列)是一种实现进程间通信的技术,可以用于解耦系统、提高性能以及实现异步处理等。本文档将详细介绍如何配置并使用RabbitMQ作为...
Webmachine 是一个应用层,为 mochiweb 提供 HTTP 语义的特性,定义一个简单而清晰的连接应用的方式。 标签:Webmachine Web框架
核心功能目的:高性能协议中继端点:WebSocket,MQTT,TCP 代码库:700 LOC(Erlang),500 LOC(JavaScript) 透析仪:REBAR,REBAR3,MAD,MIX 主机:COWBOY,EMQ,MOCHIWEB,RING,TCP,UDP协议扩展模板:DTL,...
它目前支持Cowboy,Inet,Mochiweb,Webmachine和Yaws。 SimpleBridge用作两个最受欢迎的Erlang Web框架到Web服务器的桥梁: 和 从某种意义上讲,它类似于 ,除了具有一些关键的改进/不同之处: 轻松扩展-需要...
erlang + delphi demo with Web UI`可能是通过Web界面展示Erlang和Delphi的集成,这可能使用了Erlang的Web开发框架,如Yaws或Mochiweb,与Delphi后端进行交互。 - `12. erlang demo with hot update`可能展示了...
Erlang 是一种面向并发和分布式系统的编程语言,特别适合构建高可靠性、容错性强的系统,如Web服务器。在上述代码中,我们看到的...在实际开发中,通常会使用像YAWS、Mochiweb或Cowboy这样的成熟Erlang Web服务器框架。
4. Mochiweb - 用于构建高效的Web服务器和HTTP客户端的Erlang库 5. Disco - 分布式计算框架 **Erlang 与操作系统的比较** Erlang 采用函数式编程范式,与传统的Unix操作系统(通常使用C++)有所不同。在Erlang中,...
2. **多框架兼容**:支持各种框架,例如Spring、Grails、Express、Rails、Lift、MochiWeb等。 3. **多服务集成**:能够与多种数据服务和其他服务集成,如MySQL、PostgreSQL、MongoDB、Redis、RabbitMQ等。 4. **多云...