六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 58|回复: 0

Erlang实现简单Web服务器

[复制链接]

升级  84.33%

137

主题

137

主题

137

主题

举人

Rank: 3Rank: 3

积分
453
 楼主| 发表于 2013-2-7 16:06:03 | 显示全部楼层 |阅读模式
转贴一个简单的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 itserver_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 connectionprocess(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 messageerror_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 socketdo_send(Sock,Msg) ->  case gen_tcp:send(Sock, Msg) of    ok -> ok;      {error, Reason} -> exit(Reason)  end.%% receive data from the socketdo_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了
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表