zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Nodejs实现的一个静态服务器例子

Nodejs静态服务器 实现 一个 例子
2023-09-14 09:01:05 时间

参考cnodejs.org上面的静态服务器例子,写了下面的一个nodejs静态服务器例子,里面包含cache,压缩,贴代码如下

/**

 * 静态文件服务器测试例子

 * User: xuwm

 * Date: 13-5-17

 * Time: 上午8:38

 * To change this template use File | Settings | File Templates.

var port=3333;

var http = require("http");

var url = require("url");

var fs = require("fs");

var path = require("path");

var mime = require("./mime").types;

var config = require("./config");

var zlib = require("zlib");

//创建http服务端

var server=http.createServer(function(request,response){

 var obj= url.parse(request.url);

 response.setHeader("Server","Node/V8");

 console.log(obj);

 var pathname=obj.pathname;

 if(pathname.slice(-1)==="/"){

 pathname=pathname+config.Welcome.file; //默认取当前默认下的index.html

 var realPath = path.join("assets", path.normalize(pathname.replace(/\.\./g, "")));

 console.log(realPath) ;

 var pathHandle=function(realPath){

 //用fs.stat方法获取文件

 fs.stat(realPath,function(err,stats){

 if(err){

 response.writeHead(404,"not found",{Content-Type:text/plain});

 response.write("the request "+realPath+" is not found");

 response.end();

 }else{

 if(stats.isDirectory()){

 }else{

 var ext = path.extname(realPath);

 ext = ext ? ext.slice(1) : unknown;

 var contentType = mime[ext] || "text/plain";

 response.setHeader("Content-Type", contentType);

 var lastModified = stats.mtime.toUTCString();

 var ifModifiedSince = "If-Modified-Since".toLowerCase();

 response.setHeader("Last-Modified", lastModified);

 if (ext.match(config.Expires.fileMatch)) {

 var expires = new Date();

 expires.setTime(expires.getTime() + config.Expires.maxAge * 1000);

 response.setHeader("Expires", expires.toUTCString());

 response.setHeader("Cache-Control", "max-age=" + config.Expires.maxAge);

 if (request.headers[ifModifiedSince] lastModified == request.headers[ifModifiedSince]) {

 console.log("从浏览器cache里取")

 response.writeHead(304, "Not Modified");

 response.end();

 } else {

 var raw = fs.createReadStream(realPath);

 var acceptEncoding = request.headers[accept-encoding] || "";

 var matched = ext.match(config.Compress.match);

 if (matched acceptEncoding.match(/\bgzip\b/)) {

 response.writeHead(200, "Ok", {Content-Encoding: gzip});

 raw.pipe(zlib.createGzip()).pipe(response);

 } else if (matched acceptEncoding.match(/\bdeflate\b/)) {

 response.writeHead(200, "Ok", {Content-Encoding: deflate});

 raw.pipe(zlib.createDeflate()).pipe(response);

 } else {

 response.writeHead(200, "Ok");

 raw.pipe(response);

 pathHandle(realPath);

server.listen(port);

console.log("http server run in port:"+port);

首先需要在JS文件里创建一个assets的文件夹,里面放入你要浏览的静态文件,比如,index.html,demo.js等。

运行方式为:在命令行里切换到上面的JS的文件目录,然后输入 node JS文件名

浏览器内输入http://localhost:3333/就会看到效果。

--补上上面代码里缺少的两个模块

mime.js

exports.types = {

 "css": "text/css",

 "gif": "image/gif",

 "html": "text/html",

 "ico": "image/x-icon",

 "jpeg": "image/jpeg",

 "jpg": "image/jpeg",

 "js": "text/javascript",

 "json": "application/json",

 "pdf": "application/pdf",

 "png": "image/png",

 "svg": "image/svg+xml",

 "swf": "application/x-shockwave-flash",

 "tiff": "image/tiff",

 "txt": "text/plain",

 "wav": "audio/x-wav",

 "wma": "audio/x-ms-wma",

 "wmv": "video/x-ms-wmv",

 "xml": "text/xml"

config.js


Python网络编程——静态Web服务器面向对象 把Web服务器抽象成一个类,方法初始化,在初始化中建立套接字对线。提供一个开启Web服务器的方法,让Web服务器处理客户端的请求。
Python网络编程——静态Web服务器多任务版 使用多线程,让web服务器可以同时处理多个用户的访问。当客户端和服务端建立连接成功,创建子线程,使用子线程专门处理客户端的请求,防止主线程阻塞。把创建的子线程设置成为守护主线程,防止主线程无法退出。