学习用node.js建立一个简单的web服务器

一、建立简单的Web服务器涉及到Node.js的一些基本知识点:

1、请求模块

在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解),如http、url等。模块封装特定的功能,提供相应的方法或属性,要使用这些模块,需要先请求模块获得其操作对象。

例如要使用系统的http模块,可以这样写:

var libHttp = require(‘http‘); //请求HTTP协议模块

这样,以后的程序将可以通过变量libHttp访问http模块的功能。本章例程中使用了以下系统模块:

http:封装http协议的服务器和客户端实现;

url:封装对url的解析和处理;

fs:封装对文件系统操作的功能;

path:封装对路径的解析功能。

有了这些模块,我们就可以站在巨人的肩膀上构建自己的应用。

2、控制台

为了更好的观察程序的运行,方便在异常时查看错误,可以通便变量console使用控制台的功能。

console.log(‘这是一段日志信息‘); 计时并在控制台上输出计时信息:

//开始计时console.timeEnd(‘计时器1‘); //开始名称为“计时器1”的计时器

.........

//结束计时,并输出到控制台console.timeEnd(‘计时器1‘); //结束称为“计时器1”的计时器并输出
3、定义函数

在Node.js中定义函数的办法与普通JavaScript中完全相同,不过我们推荐的写法如下,即使用一个变量为函数命名,这样可以比较方便明确的将函数作为参数传递给其他函数:

//定义一个名为showErr的函数var showErr=function(msg){        var inf="错误!"+msg;        console.log(inf+msg);        return msg;} 

4、创建Web服务器并侦听访问请求

创建Web服务器最重要的是提供Web请求的响应函数,它有两个参数,第一个代表客户端请求的信息,另一个代表将要返回给客户端的信息。在响应函数中应解析请求信息,依据请求,组装返后内容。

//请求模块var libHttp = require(‘http‘); //HTTP协议模块

//Web服务器主函数,解析请求,返回Web内容var funWebSvr = function (req, res){         res.writeHead(200, {‘Content-Type‘: ‘text/html‘});        res.write(‘<html><body>‘);        res.write(‘<h1>*** Node.js ***</h1>‘);        res.write(‘<h2>Hello!</h2>‘);        res.end(‘</body></html>‘);}

//创建一个http服务器var webSvr=libHttp.createServer(funWebSvr);

//开始侦听8124端口webSvr.listen(8124); 

5、解析Web请求

对于简单的Web网页访问请求,重要的信息包含在请求信息参数的url里,我们可以使用url解析模块解析url中的访问路径,并利用path模块,将访问路径组装为要访问的实际文件路径用于返回。

var reqUrl=req.url; //获取请求的url

//向控制台输出请求的路径console.log(reqUrl);

//使用url解析模块获取url中的路径名var pathName = libUrl.parse(reqUrl).pathname;

//使用path模块获取路径名中的扩展名if (libPath.extname(pathName)=="") {        //如果路径没有扩展名        pathName+="/"; //指定访问目录}

if (pathName.charAt(pathName.length-1)=="/"){        //如果访问目录        pathName+="index.html"; //指定为默认网页}

//使用路径解析模块,组装实际文件路径var filePath = libPath.join("./WebRoot",pathName);

6、设置返回头

由于是Web请求,需要在返回内容中包含http返回头,这里重点是依据要访问的文件路径的文件扩展名,设置http返回头的内容类型。

var contentType="";

//使用路径解析模块获取文件扩展名var ext=libPath.extname(filePath);

switch(ext){        case ".html":                contentType= "text/html";                break;        case ".js":                contentType="text/javascript";                break;        ...        ...        default:                contentType="application/octet-stream";}

//在返回头中写入内容类型res.writeHead(200, {"Content-Type": contentType });

7、向返回对象中写入访问的文件内容

有了需要访问的文件实际路径,有了文件对应的内容类型,就可以利用fs文件系统模块读取文件流并返回给客户端。

//判断文件是否存在 libPath.exists(filePath,function(exists){        if(exists){//文件存在                //在返回头中写入内容类型                res.writeHead(200, {"Content-Type": funGetContentType(filePath) });

                //创建只读流用于返回                var stream = libFs.createReadStream(filePath, {flags : "r", encoding : null});

                //指定如果流读取错误,返回404错误                stream.on("error", function() {                         res.writeHead(404);                         res.end("<h1>404 Read Error</h1>");                 }); 

                //连接文件流和http返回流的管道,用于返回实际Web内容                stream.pipe(res);        }         else { //文件不存在

                //返回404错误                res.writeHead(404, {"Content-Type": "text/html"});                res.end("<h1>404 Not Found</h1>");        }});

二、测试及运行

1、完整源码

以下100行左右的JavaScript就是建立这样一个简单web服务器的全部源码:

  1 //------------------------------------------------  2 //WebSvr.js  3 //  一个演示Web服务器  4 //------------------------------------------------  5   6 //开始服务启动计时器  7 console.time(‘[WebSvr][Start]‘);  8   9 //请求模块 10 var libHttp = require(‘http‘);    //HTTP协议模块 11 var libUrl=require(‘url‘);    //URL解析模块 12 var libFs = require("fs");    //文件系统模块 13 var libPath = require("path");    //路径解析模块 14  15 //依据路径获取返回内容类型字符串,用于http返回头 16 var funGetContentType=function(filePath){ 17     var contentType=""; 18  19     //使用路径解析模块获取文件扩展名 20     var ext=libPath.extname(filePath); 21  22     switch(ext){ 23         case ".html": 24             contentType= "text/html"; 25                         break; 26                 case ".js": 27                         contentType="text/javascript"; 28             break; 29                 case ".css": 30             contentType="text/css"; 31             break; 32                 case ".gif": 33             contentType="image/gif"; 34             break; 35                 case ".jpg": 36             contentType="image/jpeg"; 37             break; 38                 case ".png": 39             contentType="image/png"; 40             break; 41                 case ".ico": 42             contentType="image/icon"; 43             break; 44                 default: 45             contentType="application/octet-stream"; 46     } 47  48     return contentType; //返回内容类型字符串 49 } 50  51 //Web服务器主函数,解析请求,返回Web内容 52 var funWebSvr = function (req, res){   53     var reqUrl=req.url; //获取请求的url 54  55     //向控制台输出请求的路径 56     console.log(reqUrl); 57  58     //使用url解析模块获取url中的路径名 59     var pathName = libUrl.parse(reqUrl).pathname;  60  61     if (libPath.extname(pathName)=="") { 62         //如果路径没有扩展名 63             pathName+="/"; //指定访问目录 64     } 65      66     if (pathName.charAt(pathName.length-1)=="/"){ 67         //如果访问目录 68             pathName+="index.html"; //指定为默认网页 69     } 70      71     //使用路径解析模块,组装实际文件路径 72     var filePath = libPath.join("./WebRoot",pathName); 73  74     //判断文件是否存在     75     libPath.exists(filePath,function(exists){ 76             if(exists){//文件存在 77             //在返回头中写入内容类型 78             res.writeHead(200, {"Content-Type": funGetContentType(filePath) }); 79   80             //创建只读流用于返回 81             var stream = libFs.createReadStream(filePath, {flags : "r", encoding : null});  82  83             //指定如果流读取错误,返回404错误 84             stream.on("error", function() {  85                 res.writeHead(404);  86                       res.end("<h1>404 Read Error</h1>");  87               });  88              89             //连接文件流和http返回流的管道,用于返回实际Web内容 90             stream.pipe(res); 91             }  92         else { //文件不存在 93  94             //返回404错误 95             res.writeHead(404, {"Content-Type": "text/html"}); 96             res.end("<h1>404 Not Found</h1>"); 97         } 98         }); 99 100 101     102 }103 104 //创建一个http服务器105 var webSvr=libHttp.createServer(funWebSvr);106 107 //指定服务器错误事件响应108 webSvr.on("error", function(error) { 109   console.log(error);  //在控制台中输出错误信息110 }); 111 112 113 //开始侦听8124端口114 webSvr.listen(8124,function(){115 116     //向控制台输出服务启动的信息117     console.log(‘[WebSvr][Start] running at http://127.0.0.1:8124/‘); 118 119     //结束服务启动计时器并输出120     console.timeEnd(‘[WebSvr][Start]‘);
时间: 2024-10-27 05:00:25

学习用node.js建立一个简单的web服务器的相关文章

TCP学习之建立一个简单的客户/服务器系统--回射系统

TCP学习之建立一个简单的客户/服务器系统--回射系统 相关的资料可以参考Unix网络编程,这个只是修改版,不需要依赖任何文件,可以独立编译通过,而且是在两台不同的主机上进行的. fggets和fputs这两个函数来自标准I/O函数库,writen和readline见my_unp.h头文件 //my_unp.h #include<stdarg.h> #include<syslog.h> #include<stdio.h> #include<netinet/in.h

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

使用 Nodejs 搭建一个简单的Web服务器

使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 作为一个Web服务器应具备以下几个功能: 1.能显示以.html/.htm结尾的Web页面 2.能直接打开以.js/.css/.json/.text结尾的文件内容 3.显示图片资源 4.自动下载以.apk/.

如何用PHP/MySQL为 iOS App 写一个简单的web服务器(译) PART1

原文:http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app 作为一个iPhone/iPad开发者,能够自己写一个简单的web服务器将是很有用的. 例如,你可能希望在软件启动时显示一些来自服务器的更新,或者在服务器端保存一些用户数据.除了你的想象力,没有什么能限制你了. 在第一篇中,我们将会一步一步的建立一个web服务器,基于promo code system(促销码系

自己模拟的一个简单的web服务器

首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器是如何工作的 servlet容器是一个复杂的系统.不过,一个servlet容器要为一个servlet的请求提供服务,基本上有三件事要做: 1,创建一个request对象并填充那些有可能被所引用的servlet使用的信息,如参数.头部. cookies.查询字符串. URI 等等.一个 request

一个简单的Web服务器-支持Servlet请求

上接 一个简单的Web服务器-支持静态资源请求,这个服务器可以处理静态资源的请求,那么如何处理Servlet请求的呢? 判断是否是Servlet请求 首先Web服务器需要判断当前请求是否是Servlet请求. 像Tomcat,通过解析HTTP报文拿到请求url后,就可以根据web.xml来查找是否有匹配的Servlet,如果有匹配则认定为是一个有效的Servlet请求,然后将request,response传给对应的servlet的service()方法. 这里既然要实现一个简单的Web服务器,

一个简单的web服务器

static void Main(string[] args) { IPAddress localAddress = IPAddress.Loopback;//获取本机的ip地址 IPEndPoint endPoint =new IPEndPoint(localAddress, 49155); Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); socket.Bind

学习用Node.js和Elasticsearch构建搜索引擎(一)

最近的项目要用到快速全文检索,经过前期的调研,最后选用Elasticsearch搭建搜索服务器.以前做的项目中没用过这个搜索引擎,这是第一次使用. 主要是参照 <如何用 Node.js 和 Elasticsearch 构建搜索引擎>这篇文章学习的,这篇文章翻译得很好,整个过程都走下来了很流畅. 下面记录一下本人按照这篇文章的学习过程: 1.学习Elasticsearch概述. 了解Elasticsearch是什么?能做什么?可以查一下elasticsearch.lucene等的相关介绍,另外也

(一)一个简单的Web服务器

万丈高楼平地起,首先我们必须了解 超文本传输协议(HTTP) 以后才能够比较清晰的明白web服务器是怎么回事. 1. 浅析Http协议 HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送和接受数据.它是一种请求和响应协议.客户端请求一个文件而服务器响应请求.HTTP使用可靠的TCP连接--TCP默认使用80端口.第一个HTTP版是HTTP/0.9,然后被HTTP/1.0所替代.正在取代HTTP/1.0的是当前版本HTTP/1.1,它定义于征求意见文档(RFC) 2616,可以从ht