使用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){
res.end('hello\n');
});
app.listen(18001, function afterListen(){
console.log('express running on http://localhost:18001');
});
静态文件范围:
网页、纯文本、图片、前端JavaScript代码、CSS样式表文件、媒体文件、字体文件
使用Express访问静态文件
app.use(express.static('./public'));
路由:
- 将不同的请求,分配给相应的处理函数
- 区分:路径、请求方法
三种路由实现方法:
- path:比较简单
- Router:比较适合同一个路由下的多个子路由
- route:比较适合API
var express = require('express');
var morgan = require('morgan');
var app = express();
app.use(express.static('./public'));
app.use(morgan());
app.get('', function(req, res){
res.end('hello\n');
});
// Ronter路由
var Router = express.Router();
// http://example.com/post/add
// http://example.com/post/list
Router.get('/add', function(req, res){
res.end('Router /add\n');
});
Router.get('/list', function(req, res){
res.end('Router /list\n');
});
app.use('/post', Router);
// route路由
app.route('/article')
.get(function(req, res){
res.end('route /article get\n');
})
.post(function(req, res){
res.end('route /article post\n')
});
//http://example.com/news/123
app.param('newsId', function(req, res, next, newsId){
req.newsId = newsId;
next();
});
app.get('/news/:newsId', function(req, res){
res.end('newsId: ' + req.newsId+ '\n');
});
app.listen(18001, function afterListen(){
console.log('express running on http://localhost:18001');
});
中间件
- Connect:Node.js的中间件框架
- 分层处理
- 每层实现一个功能
创建TCP服务器
- 使用net模块创建TCP服务器
- 使用telnet连接TCP服务器
- 使用net创建TCP客户端
tcp.js:
var net = require('net');
const PORT = 18001;
const HOST = '127.0.0.1'
var clientHandler = function(socket){
console.log('someone connected');
socket.on('data', function dataHandler(data){
console.log(socket.remoteAddress, socket.remotePort, 'send', data.toString());
socket.write('server received\n');
});
socket.on('close', function(){
console.log(socket.remoteAddress, socket.remotePort, 'disconnected');
})
};
var app = net.createServer(clientHandler);
app.listen(PORT, HOST);
console.log('TCP server running on tcp://', HOST, ':', PORT);
tcpClient.js:
var net = require('net');
const HOST = '127.0.0.1';
const PORT = 18001;
var tcpClient = net.Socket();
tcpClient.connect(PORT, HOST, function(){
console.log('connect success');
tcpClient.write('this is tcp client by Node.js');
});
tcpClient.on('data', function(data){
console.log('received: ', data.toString());
})