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

转载  更新时间:2015年04月29日 10:27:42   投稿:junjie   我要评论

这篇文章主要介绍了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初学:Erlang的一些特点和个人理解总结

    Erlang初学:Erlang的一些特点和个人理解总结

    这篇文章主要介绍了Erlang初学:Erlang的一些特点和个人理解总结,本文总结了函数式编程、一切都是常量、轻量进程、进程端口映射及典型缺点等内容,需要的朋友可以参考下
    2015-02-02
  • Erlang编程语言的第一印象

    Erlang编程语言的第一印象

    这篇文章主要介绍了Erlang编程语言的第一印象,本文对Erlang做了一个简单总结,需要的朋友可以参考下
    2015-03-03
  • Erlang中的基本元素操作小结

    Erlang中的基本元素操作小结

    这篇文章主要介绍了Erlang中的基本元素操作小结,本文讲解了元组(tuple)、记录(record)、列表(list)、映射组(map)等内容,需要的朋友可以参考下
    2015-03-03
  • Erlang实现的一个Web服务器代码实例

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

    这篇文章主要介绍了Erlang实现的一个Web服务器代码实例,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04
  • Erlang实现的百度云推送Android服务端实例

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

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

    Erlang中的OTP简介

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

    Erlang并发编程介绍

    这篇文章主要介绍了Erlang并发编程介绍,本文讲解了进程的创建 、进程间通信、超时设置以及给出代码实例,需要的朋友可以参考下
    2015-01-01
  • Erlang中的函数与流程控制介绍

    Erlang中的函数与流程控制介绍

    这篇文章主要介绍了Erlang中的函数与流程控制介绍,本文先是讲解了函数的一些知识,然后讲解了case语句和if语句及算术表达式等内容,需要的朋友可以参考下
    2015-01-01
  • Erlang IO编程之文件目录操作常用方法小结

    Erlang IO编程之文件目录操作常用方法小结

    这篇文章主要介绍了Erlang IO编程之文件目录操作常用方法小结,本文讲解了常用的文件操作如打开文件、读取文件、写入文件、删除文件等,需要的朋友可以参考下
    2015-01-01
  • Erlang语法学习笔记:变量、原子、元组、列表、字符串

    Erlang语法学习笔记:变量、原子、元组、列表、字符串

    这篇文章主要介绍了Erlang语法学习笔记:变量、原子、元组、列表、字符串,本文简明总结了这5种类型的相关知识,需要的朋友可以参考下
    2015-01-01

最新评论