mochiweb 学习笔记2

启动创建好的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).


[size=medium]mochiweb_socket_server[/size]

先调用这个
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}).
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值