erlang web服务器性能,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) ->

"

Request Failed\n" ++

"

Request Failed

\n" ++ "Your request to " ++ LogReq ++

" failed due to: " ++ Reason ++ "\n\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了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值