`
bachmozart
  • 浏览: 111645 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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


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 楼 bachmozart 2009-06-17  
src是mochiweb源代码,priv/skel是skelton的模板代码,用那个escript生成的是priv/skel的拷贝
1 楼 hittyo 2009-06-17  
好文,请问mochiweb的所有源代码是否只有src下那些?

相关推荐

    mochiweb实例

    2. **Mochiweb_Socket**:提供了一种低级别的接口来处理网络套接字,用于与客户端建立和维护TCP连接。 3. **Mochiweb回应(Response)**:Mochiweb提供了一个结构体来构建HTTP响应,包括状态码、响应头和响应体。你...

    erlang mochiweb-test demo

    2. **Web 服务器进程模型**:Mochiweb 使用 Erlang 的进程模型来处理每个连接,这使得它非常适合处理高并发场景。每个连接都被分配到一个独立的进程,保证了请求之间的隔离,同时也易于实现并发处理。 3. **HTTP ...

    mochiweb:MochiWeb 是一个用于构建轻量级 HTTP 服务器的 Erlang 库

    MochiWeb 的最新版本可在MochiWeb 的邮件列表位于 设置 MochiWeb 环境需要 Erlang OTP,可在使用项目创建一个新的 mochiweb:make app PROJECT=project_name 要使用特定目录中的项目创建新的 mochiweb: make app ...

    基于mochiweb的聊天室

    通过学习和分析这个项目,开发者可以深入理解Erlang的并发模型、Mochiweb的工作原理,以及如何利用它们构建高效、可靠的Web服务。同时,这也为扩展到更复杂的实时应用,如协作工具、游戏服务器等,提供了基础。

    mochiweb:Mochi Media出色的HTTP库的一个分支-可以在https上找到其规范源

    MochiWeb的邮件列表位于 R12B兼容性:MochiWeb的母版已通过R14A及更高版本进行了测试。 与R12B兼容的分支在单独维护。为方便起见,该存储库的R12B分支有时会在官方存储库中进行镜像。 要使用项目创建新的mochiweb,...

    erlang web frame

    描述中的“erlang web frame”可能指的是Erlang生态系统中的多个Web框架,其中包括了Mochiweb和Cowboy这两个著名的名字。它们都是轻量级、高性能的HTTP服务器实现,常被用作构建Web应用的基础。 1. **Mochiweb**:...

    erlang-rpssl-comet:使用Mochiweb和Comet技术的Erlang网页游戏-Rock-Paper-Scissors-Spock-Lizard

    RPSSL-Rock-Paper-Scissors-Spock-Lizard是一款简单但着名的2人游戏。 通常,它是第一人称自己玩的,但这是网络版本。 Web版本使用,该是运行时间很长的HTTP请求,可用于将服务器立即将数据推送到客户端。 每个...

    erlang实战IP查询服务

    ### Erlang实战IP查询服务知识点解析 #### 一、项目背景与目标 - **项目名称**: Erlang实战IP查询服务 ...对于有兴趣学习Erlang或者希望深入了解其在网络编程中的应用的开发者来说,这是一个非常有价值的实践案例。

    使用rebar工具开发erlang工程项目和发布erlang工程项目学习.pdf

    使用 rebar 工具开发 Erlang 工程项目和发布 Erlang 工程项目学习 本文主要介绍了使用 rebar 工具开发 Erlang 工程项目和发布 Erlang 工程项目的方法。rebar 是一个 Erlang 构建工具,可以方便的编译测试 Erlang ...

    erlang websocket

    2. **Erlang实现Websocket**:在Erlang中,可以使用如`cowboy`或`mochiweb`这样的Web框架来处理Websocket连接。它们提供了方便的中间件,使得在Erlang进程中直接处理Websocket连接成为可能。例如,`cowboy`中的`...

    mql超级详细学习文档

    ### mql超级详细学习文档 #### 一、MQ配置与安装步骤 MQ(Message Queue,消息队列)是一种实现进程间通信的技术,可以用于解耦系统、提高性能以及实现异步处理等。本文档将详细介绍如何配置并使用RabbitMQ作为...

    Webmachine.zip

    Webmachine 是一个应用层,为 mochiweb 提供 HTTP 语义的特性,定义一个简单而清晰的连接应用的方式。 标签:Webmachine Web框架

    n2o::hollow_red_circle:N2O:分布式应用程序服务器

    核心功能目的:高性能协议中继端点:WebSocket,MQTT,TCP 代码库:700 LOC(Erlang),500 LOC(JavaScript) 透析仪:REBAR,REBAR3,MAD,MIX 主机:COWBOY,EMQ,MOCHIWEB,RING,TCP,UDP协议扩展模板:DTL,...

    simple_bridge:一个简单,标准化的Erlang HTTP服务器接口库

    它目前支持Cowboy,Inet,Mochiweb,Webmachine和Yaws。 SimpleBridge用作两个最受欢迎的Erlang Web框架到Web服务器的桥梁: 和 从某种意义上讲,它类似于 ,除了具有一些关键的改进/不同之处: 轻松扩展-需要...

    Erlang实战

    通过本案例的学习,我们不仅了解了如何使用Erlang构建高性能的在线IP查询服务,而且还深入学习了OTP的关键行为如gen_server、gen_fsm和gen_event的具体应用。这种实践不仅有助于初学者快速掌握Erlang的核心概念,还...

    JavaScript + Delphi + ErLang讲座内容(4)

    erlang + delphi demo with Web UI`可能是通过Web界面展示Erlang和Delphi的集成,这可能使用了Erlang的Web开发框架,如Yaws或Mochiweb,与Delphi后端进行交互。 - `12. erlang demo with hot update`可能展示了...

    Erlang实现的一个Web服务器代码实例

    Erlang 是一种面向并发和分布式系统的编程语言,特别适合构建高可靠性、容错性强的系统,如Web服务器。在上述代码中,我们看到的...在实际开发中,通常会使用像YAWS、Mochiweb或Cowboy这样的成熟Erlang Web服务器框架。

    Erlang的高级特性和应用

    4. Mochiweb - 用于构建高效的Web服务器和HTTP客户端的Erlang库 5. Disco - 分布式计算框架 **Erlang 与操作系统的比较** Erlang 采用函数式编程范式,与传统的Unix操作系统(通常使用C++)有所不同。在Erlang中,...

    CloudFoundry - The building of the Open PaaS Presentation

    2. **多框架兼容**:支持各种框架,例如Spring、Grails、Express、Rails、Lift、MochiWeb等。 3. **多服务集成**:能够与多种数据服务和其他服务集成,如MySQL、PostgreSQL、MongoDB、Redis、RabbitMQ等。 4. **多云...

Global site tag (gtag.js) - Google Analytics