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)-> casegen_tcp:listen(Port,[binary,{packet,0},{active,false}])of {ok,LSock}->server_loop(LSock,DocRoot); {error,Reason}->exit({Port,Reason}) end. %%mainserverloop-waitfornextconnection,spawnchildtoprocessit server_loop(LSock,DocRoot)-> casegen_tcp:accept(LSock)of {ok,Sock}-> spawn(?MODULE,process,[Sock,DocRoot]), server_loop(LSock,DocRoot); {error,Reason}-> exit({accept,Reason}) end. %%processcurrentconnection process(Sock,DocRoot)-> Req=do_recv(Sock), {ok,[Cmd|[Name|[Vers|_]]]}=split(Req,"[\r\n]"), FileName=DocRoot++Name, LogReq=Cmd++""++Name++""++Vers, Resp=casefile:read_file(FileName)of {ok,Data}-> io:format("~p~pok~n",[LogReq,FileName]), Data; {error,Reason}-> io:format("~p~pfailed~p~n",[LogReq,FileName,Reason]), error_response(LogReq,file:format_error(Reason)) end, do_send(Sock,Resp), gen_tcp:close(Sock). %%constructHTMLforfailuremessage error_response(LogReq,Reason)-> "<html><head><title>RequestFailed</title></head><body>\n"++ "<h1>RequestFailed</h1>\n"++"Yourrequestto"++LogReq++ "faileddueto:"++Reason++"\n</body></html>\n". %%sendalineoftexttothesocket do_send(Sock,Msg)-> casegen_tcp:send(Sock,Msg)of ok->ok; {error,Reason}->exit(Reason) end. %%receivedatafromthesocket do_recv(Sock)-> casegen_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了