it编程 > 前端脚本 > Erlang

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

71人参与 2024-05-15 Erlang

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

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

一篇文章带你从入门到精通:RabbitMQ

05-15

Erlang中的Record详解

05-15

深入浅析RabbitMQ镜像集群原理

05-15

Erlang中遍历取出某个位置的最大值代码

05-15

erlang on_load_function_failed排查过程解析

05-15

Erlang中的基本元素操作小结

05-15

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论