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) ->
 "<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)

相关推荐

  • 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() ->

  • node学习笔记之读写文件与开启第一个web服务器操作示例

    本文实例讲述了node读写文件与开启第一个web服务器操作.分享给大家供大家参考,具体如下: 读取文件 Node中的js 具有文件操作的能力 使用require  方法加载fs核心模块 * require是一个方法 * 他的作用就是用来加载模块的 * 在Node中,模块有三种: *      具名的核心模块,列如 fs.http *      用户自己编写的文件模块 *          相对路径必须加./ *      在Node中 ,没有核心作用域,只有模块作用域 *          外部

  • 详解node.js创建一个web服务器(Server)的详细步骤

    前言 在 node.js 中创建一个服务器非常简单,只需要使用 node.js 为我们提供的 http 模块及相关 API 即可创建一个麻雀虽小但五脏俱全的web 服务器,相比 Java/Python/Ruby 搭建web服务器的过程简单的很. http model 要想创建一个基于 node.js 的 web 服务器,你就必须使用 node.js 提供的 http 模块,node.js 中的 http 接口旨在支持传统上难以使用的协议的许多特性, 特别是,大块的.可能块编码的消息,接口永远不会

  • tomcat组件图解 一个web服务器的架构演化史

    1. tomcat是谁? 2. tomcat可以做什么? tomcat是一个web容器,可以将web应用部署到tomcat,由它提供web服务,一个web容器中可以部署多个web应用,这些web应用可以是同一个域名,也可以是多个域名的服务. 3. tomcat有哪些组件 4.怎么快速理解这些组件呢? 我们可以假设我们来设计一个web容器,我们该什么设计? 第一代:接收请求,处理请求,返回结果集中到整个web容器中,如下图所示: 第二代 :连接管理和处理逻辑分开 使用过程中发现,每次都要打开soc

  • 基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订单所属用户(用户对象) 订单所包含的商品(不定数量个商品对象) 订单总金额 订单应付金额: 总金额500~1000,打折85折 总金额1000~1500,打折80折 总金额1500~2000,打折70折 总金额超过2000,打折65折 在此基础上,还要看用户的vip等级 用户vip等级为:一般会员,

  • 微信小程序实现一个简单swiper代码实例

    这篇文章主要介绍了微信小程序实现一个简单swiper代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 话不多说,上截图 HTML <swiper class="swiper-block" previous-margin="70rpx" next-margin="70rpx" current="0" autoplay="true" bindcha

  • android 上传文件到服务器代码实例

    android对于上传文件,还是很简单的,和java里面的上传都是一样的,基本上都是熟悉操作输出流和输入流!还有一个特别重要的就是需要一些content-type这些参数的配置!  如果这些都弄好了,上传就很简单了!   下面是我写的一个上传的工具类: 复制代码 代码如下: package com.spring.sky.image.upload.network; import java.io.DataOutputStream;import java.io.File;import java.io.

  • Java上传文件FTP服务器代码实例

    FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Protocol(文件传输协议).顾名思义,就是专门用来传输文件的协议.简单地说,支持FTP协议的服务器就是FTP服务器. 在实际的应用中,通常是通过程序来进行文件的上传. 1.实现java上传文件到ftp服务器中 2.新建maven项目 添加依赖 <dependency> <groupId>comm

  • python批量同步web服务器代码核心程序

    #!/usr/bin/env python #coding:utf8 import os,sys import md5,tab from mysql_co.my_db import set_mysql from ssh_co.ssh_connect import sshd from ssh_co.cfg.config import ssh_message,item_path from file import findfile def my_mysql(): db_file={} my_conne

  • java实现一个简单的Web服务器实例解析

    Web服务器也称为超文本传输协议服务器,使用http与其客户端进行通信,基于java的web服务器会使用两个重要的类, java.net.Socket类和java.net.ServerSocket类,并基于发送http消息进行通信. 这个简单的Web服务器会有以下三个类: *HttpServer *Request *Response 应用程序的入口在HttpServer类中,main()方法创建一个HttpServer实例,然后调用其await()方法,顾名思义,await()方法会在指定端口上

随机推荐