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

 更新时间:2015年04月29日 10:27:42   投稿:junjie  
这篇文章主要介绍了Erlang实现的一个Web服务器代码实例,本文直接给出实现代码,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

转贴一个简单的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中的Record详解

    Erlang中的Record详解

    这篇文章主要介绍了Erlang中的Record详解,本文讲解了定义Record、创建Record、访问Record、更新Record、匹配Record和Guard语句、使用Record等内容,需要的朋友可以参考下
    2015-04-04
  • Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法

    Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法

    这篇文章主要介绍了Erlang程序设计(第2版)读书笔记:Erlang安装和基础语法,需要的朋友可以参考下
    2015-02-02
  • 深入浅析RabbitMQ镜像集群原理

    深入浅析RabbitMQ镜像集群原理

    当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目的
    2021-08-08
  • erlang?on_load_function_failed排查过程解析

    erlang?on_load_function_failed排查过程解析

    这篇文章主要为大家介绍了erlang?on_load_function_failed的排查过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Erlang中的OTP简介

    Erlang中的OTP简介

    这篇文章主要介绍了Erlang中的OTP简介,OTP包含了一组库和实现方式,可以构建大规模、容错和分布式的应用程序,包含了许多强大的工具,能够实现H248,SNMP等多种协议,需要的朋友可以参考下
    2015-03-03
  • Erlang实现的百度云推送Android服务端实例

    Erlang实现的百度云推送Android服务端实例

    这篇文章主要介绍了Erlang实现的百度云推送Android服务端实例,本文先是讲解了实现步骤,然后给出实现代码,需要的朋友可以参考下
    2015-01-01
  • Erlang中的模块与模式匹配介绍

    Erlang中的模块与模式匹配介绍

    这篇文章主要介绍了Erlang中的模块与模式匹配介绍,本文分别对模块与模式匹配做了讲解,需要的朋友可以参考下
    2015-03-03
  • Erlang实现的一个Web服务器代码实例

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

    这篇文章主要介绍了Erlang实现的一个Web服务器代码实例,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04
  • Erlang分布式节点中的注册进程使用实例

    Erlang分布式节点中的注册进程使用实例

    这篇文章主要介绍了Erlang分布式节点中的注册进程使用实例,本文直接给出实例代码,需要的朋友可以参考下
    2015-02-02
  • Erlang中的注册进程使用实例

    Erlang中的注册进程使用实例

    这篇文章主要介绍了Erlang中的注册进程使用实例,本文给出正常进程通信实例和使用使用注册进程通信实例,需要的朋友可以参考下
    2015-02-02

最新评论

?


http://www.vxiaotou.com