Node.js创建Web、TCP服务器


Posted in Javascript onDecember 05, 2017

使用http模块创建Web服务器

Web服务器的功能:

接受HTTP请求(GET、POST、DELETE、PUT、PATCH)

处理HTTP请求(自己处理,或请求别的程序处理)

做出响应(返回页面、文件、各类数据等)

常见的Web服务器架构:

Nginx、Apache:负责接受HTTP请求,确定谁来处理请求,并返回请求的结果

php-fpm / php模块:处理分配给自己的请求,并将处理结果返回给分配者

常见请求种类:

请求文件:包括静态文件(网页、图片、前端JavaScript文件、css文件...),及由程序处理得到的文件

完成特定的操作:如登录、获取特定数据等

Node.js的Web服务器:

不依赖其他特定的Web服务器软件(如Apache、Nginx、IIS......)

Node.js代码处理请求的逻辑

Node.js代码负责Web服务器的各种“配置”

使用Express创建Web服务器

简单的Express服务器

静态文件服务

路由

中间件

简单的Express服务器:

var express = require('express'); 
var app = express(); 
app.get('', function(req, res){ 
<span style="white-space:pre"> </span>res.end('hello\n'); 
<span style="white-space:pre"> </span>}); 
<span style="white-space:pre"> </span>app.listen(18001, function afterListen(){ 
<span style="white-space:pre"> </span>console.log('express running on http://localhost:18001'); 
<span style="white-space:pre"> </span>});

静态文件范围:

网页、纯文本、图片、前端JavaScript代码、CSS样式表文件、媒体文件、字体文件

使用Express访问静态文件

<span style="white-space:pre"></span>app.use(express.static('./public'));

路由:

将不同的请求,分配给相应的处理函数

区分:路径、请求方法

三种路由实现方法:

path:比较简单

Router:比较适合同一个路由下的多个子路由

route:比较适合API

中间件

Connect:Node.js的中间件框架

分层处理

每层实现一个功能

创建TCP服务器

使用net模块创建TCP服务器

使用telnet连接TCP服务器

使用net创建TCP客户端

利用node.js搭建简单web服务器JS代码部分:

var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
var dir, arg = process.argv[2] || ''; // 命令行第三个参数,用来接收目录,可为空,相对当前server.js文件的目录名称
// 比如使用命令 node server debug,意思就是debug文件夹与server.js文件同级
// 且你想以debug文件夹启动web服务
 
http.createServer(function (req, res) {
var pathname = __dirname + url.parse(req.url).pathname;
dir = dir ? dir : pathname; // 记住dir(目录)
pathname = dir ? pathname.replace(dir, dir + arg + '/') : pathname; // 替换文件静态路径
if (path.extname(pathname) == "") {
pathname += "/";
}
if (pathname.charAt(pathname.length - 1) == "/") {
pathname += "index.html"; // 入口文件,此处默认index.html
}
 
fs.exists(pathname, function (exists) {
if (exists) {
switch (path.extname(pathname)) {
case ".html":
res.writeHead(200, {"Content-Type": "text/html"});
break;
case ".js":
res.writeHead(200, {"Content-Type": "text/javascript"});
break;
case ".css":
res.writeHead(200, {"Content-Type": "text/css"});
break;
case ".gif":
res.writeHead(200, {"Content-Type": "image/gif"});
break;
case ".jpg":
res.writeHead(200, {"Content-Type": "image/jpeg"});
break;
case ".png":
res.writeHead(200, {"Content-Type": "image/png"});
break;
default:
res.writeHead(200, {"Content-Type": "application/octet-stream"});
} 
// res可以自己添加信息来简单交互 比如可以修改点header信息 或者修改返回的资源数据
fs.readFile(pathname, function (err, data) {
res.end(data);
});
}
else {
res.writeHead(404, {"Content-Type": "text/html"});
res.end("<h1>404 Not Found</h1>");
}
});
}).listen(8085, "127.0.0.5"); // 服务器端口
console.log("server running at http://127.0.0.5:8085/");
Javascript 相关文章推荐
弹出广告特效(一个IP只弹出一次)的代码
Jul 27 Javascript
JavaScript 闭包在封装函数时的简单分析
Nov 28 Javascript
js各种验证文本框输入格式(正则表达式)
Oct 22 Javascript
vue中的计算属性的使用和vue实例的方法示例
Dec 04 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
Dec 25 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
vue+layui实现select动态加载后台数据的例子
Sep 20 Javascript
微信小程序实现倒计时功能
Nov 19 Javascript
可拖拽组件slider.js使用方法详解
Dec 04 Javascript
微信小程序用户登录和登录态维护的实现
Dec 10 Javascript
实例讲解javascript实现异步图片上传方法
Dec 05 #Javascript
jquery如何实现点击空白处隐藏元素
Dec 05 #jQuery
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 #jQuery
最实用的JS数组函数整理
Dec 05 #Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
Dec 05 #Javascript
Vue DevTools调试工具的使用
Dec 05 #Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 #Javascript
You might like
php面向对象的方法重载两种版本比较
2008/09/08 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
PHP 进度条函数的简单实例
2017/09/19 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
HTML中事件触发列表与解说
2007/07/09 Javascript
javascript 写类方式之一
2009/07/05 Javascript
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
jQuery中的基本选择器用法学习教程
2016/04/14 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
2018/08/19 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
Python中eval带来的潜在风险代码分析
2017/12/11 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
基于python实现名片管理系统
2018/11/30 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
python判断链表是否有环的实例代码
2020/01/31 Python
专科文秘应届生求职信
2013/11/18 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技