Erlang实现的一个Web服务器代码实例
2015-04-29 10:27
2011 查看
转贴一个简单的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了
相关文章推荐
- 12种实现301网页重定向方法的代码实例(含Web编程语言和Web服务器)
- java实现一个简单的Web服务器实例解析
- Python+tkinter使用80行代码实现一个计算器实例
- web项目Log4j日志输出路径配置问题 问题描述:一个web项目想在一个tomcat下运行多个实例(通过修改war包名称的实现),然后每个实例都将日志输出到tomcat的logs目录下实例名命名的文
- Android实现一个包含表格的图标库实例代码
- Java代码之JDBC实现数据库之间定时的表格传输(由一个库读取到另一个库)实例
- MyBatis代码实例系列-05:Mybatis初步整合Spring + Spring MVC框架,实现Web请求实例
- 入门Webpack(六)用一个实例说明代码分割和懒加载
- 同一个页面使用webuploader实现多实例多上传案例
- JavaScript实现一个简易的计算器实例代码
- 自己动手实现一个WEB服务器
- 自己动手实现一个WEB服务器
- Android实现一个丝滑的自动轮播控件实例代码
- .NET Core WebApi中如何实现多态数据绑定实例代码
- 400多行Python代码实现了一个FTP服务器
- haskell实现多线程服务器实例代码
- Nodejs实现的一个静态服务器实例
- GIT服务器实现web代码自动部署