一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Erlang实现方式的一个Web服务器代码实例实用指南

时间:2026-09-01 20:40:02 编辑:袖梨 来源:一聚教程网

平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“Erlang实现方法的一个Web服务器代码实例”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。

转贴一个轻松的Web服务器:

httpd.erl


%% httpd.erl - MicroHttpd
-module(httpd).
-author("[email protected]").
 
-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,"[ rn]"),
 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()启动服务器,就能够访问(链接已移除)

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

热门栏目