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

2023-12-05 0 469

转贴一个简单的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了

您可能感兴趣的文章:Go/Python/Erlang编程语言对比分析及示例代码python读取excel表格生成erlang数据Erlang中的Record详解Erlang初学:Erlang的一些特点和个人理解总结CentOS 6.5源码安装Erlang教程ERLANG和PYTHON互通实现过程详解

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Erlang Erlang实现的一个Web服务器代码实例 https://www.u-9.cn/jiaoben/erlang/101830.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务