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

Erlang实现简单Web服务器

阅读更多
转贴一个简单的Web服务器:
httpd.erl
%% httpd.erl - MicroHttpd
-module(httpd).
-author("ninhenry@gmail.com").

-export([start/0,start/1,start/2,process/2]).
-import(regexp,[split/2]).

-define(defPort,8888).
-define(docRoot,"public").

start() -> start(?defPort,?docRoot).
start(Port) -> start(Port,?docRoot).  
start(Port,DocRoot) ->
  case gen_tcp:listen(Port, [binary,{packet, 0},{active, false}]) of
    {ok, LSock} -> server_loop(LSock,DocRoot);
	  {error, Reason}	-> exit({Port,Reason})
  end.

%% main server loop - wait for next connection, spawn child to process it
server_loop(LSock,DocRoot) ->
  case gen_tcp:accept(LSock) of
    {ok, Sock} ->
      spawn(?MODULE,process,[Sock,DocRoot]),
      server_loop(LSock,DocRoot);
    {error, Reason} ->
      exit({accept,Reason})
  end.

%% process current connection
process(Sock,DocRoot) ->
  Req = do_recv(Sock),
  {ok,[Cmd|[Name|[Vers|_]]]} = split(Req,"[ \r\n]"),
  FileName = DocRoot ++ Name,
  LogReq = Cmd ++ " " ++ Name ++ " " ++ Vers,
  Resp = case file:read_file(FileName) of
    {ok, Data} ->
      io:format("~p ~p ok~n",[LogReq,FileName]),
      Data;
    {error, Reason}	->
      io:format("~p ~p failed ~p~n",[LogReq,FileName,Reason]),
      error_response(LogReq,file:format_error(Reason))
    end, 
  do_send(Sock,Resp),
  gen_tcp:close(Sock).

%% construct HTML for failure message
error_response(LogReq,Reason) ->
  "<html><head><title>Request Failed</title></head><body>\n" ++
  "<h1>Request Failed</h1>\n" ++ "Your request to " ++ LogReq ++
  " failed due to: " ++ Reason ++ "\n</body></html>\n".

%% send a line of text to the socket
do_send(Sock,Msg) ->
  case gen_tcp:send(Sock, Msg) of
    ok -> ok;
      {error, Reason} -> exit(Reason)
  end.

%% receive data from the socket
do_recv(Sock) ->
  case gen_tcp:recv(Sock, 0) of
    {ok, Bin} -> binary_to_list(Bin);
      {error, closed} -> exit(closed);
      {error, Reason} -> exit(Reason)
  end.

运行时在httpd.erl本地建一个public目录,public目录里放一个index.html文件
然后httpd:start()启动服务器,就可以访问http://localhost:8888/index.html了
分享到:
评论

相关推荐

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

    主要介绍了Erlang实现的一个Web服务器代码实例,本文直接给出实现代码,需要的朋友可以参考下

    erlang写的一个特别的web服务器

    erlang写的一个特别的web服务器 .转载 谢谢

    elli:简单,健壮和高性能的Erlang Web服务器

    如果您发现自己正在研究Web服务器的实现,那么elli可能适合您。 如果您要构建Web服务而不是网站,那么elli可能适合您。 Elli在Wooga和Game Analytics中用于生产。 Elli需要OTP 18.0或更高版本。安装要使用elli您...

    ChicagoBoss, Erlang web MVC,现在有Comet.zip

    ChicagoBoss, Erlang web MVC,现在有Comet 芝加哥老板:开始小,梦想大 注意这是一个支持 Erlang 18的主分支。 对于旧的Erlang版本使用遗留分支。芝加哥老板是一个由 Rails 启发并用Erlang编写的服务器框架。 它...

    erltwilio:用于接收 Twilio SMS 消息的 Erlang Cowboy Web 服务器

    使用以下命令设置 Heroku 项目以使用 Erlang buildpack: heroku config:add BUILDPACK_URL=" " -a twilio-sms-web 带有 Curl 的 POST 示例: curl -X POST ' ' -d 'Body=SMS_message_body&From=SMS_sending_...

    elli:简单,健壮和高性能的Erlang Web服务器

    elli-用于HTTP API的Erlang Web服务器

    Erlang Web-开源

    Erlang Web 是一个基于 HTTP 协议的应用程序框架,使开发人员从实现动态页面中经常使用的行为中解脱出来。

    graphql-erlang:Erlang中的GraphQL实现

    它的主要用途是在其他一些现有的传输库之上,例如牛仔Web服务器。 当请求到达时,它可以由GraphQL支持库处理,并且可以给出GraphQL答案。 在某种程度上,这将所有REST端点替换为一个端点:一个用于Graph Queries。 ...

    Erlang入门手册

    Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等。据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍!

    yaws:Yaws Web服务器

    这是Yaws,是用Erlang编写的动态内容的Web服务器。 准备构建 获取并安装一个Erlang系统( )。 要编译Yaws,需要Erlang / OTP 18.0或更高版本。 如果您已经从github克隆了源代码,并且想使用自动工具进行构建,请...

    echat:带有Erlang后端的Web聊天JavaScript库

    使用稳定,快速的Erlang后端以及易于使用JavaScript库,创建您自己的Web聊天界面。 例子 /basic/index.html有一个示例界面,但是它不能在所有浏览器中都起作用,也不是很好。 用法 开始 加载依赖项并使用rebar get-...

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

    SimpleBridge用作两个最受欢迎的Erlang Web框架到Web服务器的桥梁: 和 从某种意义上讲,它类似于 ,除了具有一些关键的改进/不同之处: 轻松扩展-需要200到400行,以增加对新HTTP服务器的支持,包括网桥模块本身...

    erlang-org:erlang.org网站

    Erlang.org使用来提供Web服务器支持,并使用来呈现Web页面。 它使用连接到PostgreSQL数据库。 使用docker设置Erlang.org 跑步: 码头工人组成 然后连接到并享受。 Erlang / OTP 使用Erlang / OTP 18.3。 请按照...

    minimal-cowboy:最小的erlangotp应用程序,集成了牛仔Web服务器

    最小牛仔这是将Cowboy-Web服务器集成到erlang / otp应用程序堆栈中的最小示例。 构建系统基于GNU / make和钢筋。 通过以下方式解决牛仔的依赖关系: make deps使用以下命令构建并启动该应用程序: make buildmake ...

    awesome-erlang:精湛的Erlang框架,库和软件的精选列表

    很棒的精选的Erlang框架,库和软件的精选列表。 -Erlang / OTP -EMQ X Broker-5G时代用于物联网的可... -Lisp风味Erlang(LFE) -Erlang Web MVC,现在具有Comet功能 -MochiWeb是用于构建轻量级HTTP服务器的Erlang库。

    Webserver:Erlang 中的一个简单的网络服务器

    #一个小型网络服务器 ##这是什么? 这是一个在 Erlang 中创建一个小型且受限的网络服务器的学校项目。 ##作者金哈马尔 皇家理工学院 斯德哥尔摩

    weby:Gleam Lang中的简单Web服务器

    Weby Gleam基本Web服务器 快速开始 克隆存储库并CD进入其中。 跑步: # Run the Erlang REPL rebar3 shell 造访

    webdrv:Erlang 中的 WebDriver 实现

    webdrv - Erlang 中的 WebDriver 实现 ... WebDriver API 目前正在由 W3C 标准化(撰写本文时的最新工作草案是从 2013 年 5 月 30 日开始的),但是 WebDriver 服务器端的主要实现者(如 Selenium 和 ChromeDr

    erws_example:在 Erlang 中使用 websockets 的例子

    所有消息都使用二进制(端到端)[Erlang 外部术语格式的 Javascript 实现] ( ) 在客户端/服务器之间交换。 得到 $ git clone https://github.com/saleyn/erws_example.git 建造 初始构建: $ make deps 连续构建...

    plug_cowboy:Cowboy Web服务器的插头适配器

    用于Erlang Web服务器的插头适配器。 安装 您可以通过添加依赖plug_cowboy在项目中使用plug_cowboy : def deps do [ { :plug_cowboy , " ~&gt; 2.0 " }, ] end 然后,您可以使用以下命令启动适配器: Plug . ...

Global site tag (gtag.js) - Google Analytics