net模块
1.一个简单的 服务器端和客户端
服务器端 示例代码:
// 引入net模塊
const net = require("net");
// 創建服務器端對象
let server = net.createServer();
// 開始監聽端口
server.listen(5888);
// 監聽客戶端的連接事件,客戶端連接上後,會自動執行回調函數,回調函數的參數就是指向客戶端的socket。
server.on('connection', client => {
// client就是指向客戶端的一個對象,可以通過它給客戶端發送數據。
// 可以是:可寫流 或 可讀流
client.on("data", chunk => { // 接收客戶端數據,chunk是一個buf
console.log(chunk.toString('utf8'));
});
// 往客戶端寫入數據
client.write("hi!");
client.end("結束連接。");
});
客户端 示例代码:
// 引入內置模塊net
const net = require("net");
// 客戶端進行連接
// client:是客戶端連接服務器端的對象
let client = net.connect(5888, '127.0.0.1', ()=>{
console.log("連接上了服務器端");
});
// 接收來自服務端的數據
client.on("data", chunk=>{
console.log(chunk.toString('utf8'));
});
client.write("你好,我是lili!");
client.end();
2.用nodejs来实现一个简单的web服务器
示例代码(服务器端):
// 引入net模塊
const net = require("net");
// 創建服務器端對象
let server = net.createServer();
// 開始監聽端口
server.listen(5888, ()=>{
console.log("開始監聽5888端口");
});
// 監聽客戶端的連接事件,客戶端連接上後,會自動執行回調函數,回調函數的參數就是指向客戶端的socket。
server.on('connection', client => {
// client就是指向客戶端的一個對象,可以通過它給客戶端發送數據。
// 可以是:可寫流 或 可讀流
// 讀取數據
client.on("data", chunk => { // 接收客戶端數據,chunk是一個buf
console.log(chunk.toString('utf8'));
});
// 往客戶端寫入數據
// 在ES6語法中,增加了用反引號做多行字符定義的語法。
// client.write("hi!");
client.write(`HTTP/1.1 200 OK
Server: Apache
Content-Type: text/html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>requirejs实现amd标准的应用</title>
</head>
<body>
<h1> from server! </h1>
</body>
</html>
`);
client.end("");
});
访问我们这个简单的服务器端展示图:
http模块
1.一个简单的web服务器
示例代码:
// 用http模塊創建一個web服務器
const http = require("http");
let server = http.createServer(); // 創建一個http的服務器端對象
// 讓服務器端對象開始監聽。
server.listen(5888, ()=>{
console.log("服務器開始監聽端口:5888。。。, 可以用瀏覽器打開:http://127.0.0.1:5888");
});
// 監聽客戶端的請求數據和發送報文
server.on("request", (req, res)=>{
// req: 請求報文的封裝
console.log(req.headers);
console.log("****");
console.log(req.url);
console.log("****");
console.log(req.method); // 打印请求的方法get post
// res:响应的封装
res.write("hi~~");
res.end();
})
演示结果:
示例代码2:
// 引入http模块
const http = require("http");
// 当发生request请求事件时,自动调用回调函数
http.createServer((req, res)=>{
// req: data事件,监听数据
// req.on("data", (trunk)=>{
// });
console.log(req.headers);
console.log(req.url);
console.log(req.method);
res.write("123");
res.end(); // 不再写了
}).listen(5888, ()=>{
console.log("服务器端监听端口5888成功。。。")
});
2.一个相对复杂一点的web服务器
步骤:
- 启动server
- 监听
- 设置request事件来对客户端的请求做响应
示例代码:
// 用http模塊創建一個web服務器
const http = require("http");
const path = require("path");
const fs = require("fs");
let server = http.createServer(); // 創建一個http的服務器端對象
// 讓服務器端對象開始監聽。
server.listen(5888, ()=>{
console.log("服務器開始監聽端口:5888。。。, 可以用瀏覽器打開:http://127.0.0.1:5888");
});
// 監聽客戶端的請求數據和發送報文
server.on("request", (req, res)=>{
// req: 請求報文的封裝
// res:响应的封装
let conType = "text/plain"
console.log(req.url);
let fileName = path.join(__dirname, 'dist/', req.url); // 获取客户端请求的文件
// 对客户端请求文件类型进行判断
switch(path.extname(fileName)){ // 具体可以去查 HTTP content-type对照表
case ".png":
conType = "image/png";
break;
case ".jpg":
case ".jpeg":
conType = "image/jpeg";
break;
case ".gif":
conType = "image/gif";
break;
case ".html":
conType = "text/html";
break;
case ".css":
conType = "text/css";
break;
default:
conType = "text/plain";
break;
}
// 注意:设置响应文件类型和状态码
res.writeHeader(200, {
'Content-Type': conType // 针对不同的请求类型(如:文本页面、图片。。。)回应不同
});
let reader = fs.createReadStream(fileName); // 采用可读流的方式读取 请求的文件 的内容
reader.pipe(res); // 采用管道的方式 回复给客户端
})
3.get post
示例代码:
// 引入相关模块
const http = require("http");
// 发送一个个get请求
http.get("http://127.0.0.1:5888", res => {
res.on('data', trunk => console.log(trunk.toString('utf8')));
});
// post 通用的httpRequest对象发送请求
let request = http.request({ // 设置了请求的参数
protocol: 'http:', // 请求的协议
host: "127.0.0.1", // 请求的host
port: 5888, // 端口
method: 'POST', // GET请求
timeout: 2000, // 超时时间
path: '/dist' // 请求路径
}, res=>{
res.on("data", trunk => console.log(trunk.toString('utf8')));
});
request.end(); // 这是真正的发送请求。
connect中间件模块
安装:npm i -P connect
示例代码:
// 引入 connect模块 (对http模块的封装)
const connect = require("connect");
// connect:本身是一个函数,返回一个 中间件的控制器。
let app = connect();
// 注册中间件
app.use((req, res, next)=>{
// req: request对象
// res: response对象
console.log("中间件1");
next(); // 执行完了执行下一个
});
app.use((req, res, next)=>{
console.log("中间件2");
next();
});
// 请求以/api的才会触发这个
app.use('/api', (req, res, next)=>{
console.log("请求/api的");
next();
});
// 带err的,表示错误处理
app.use((err, req, res, next) => {
console.log("错误处理的中间件");
});
app.use((req, res)=>{ // 最后一个中间件了,故不用next了。
res.write("3");
console.log("最后一个中间件。");
res.end(); // 结束response
});
// 设置监听
app.listen(5888, ()=>{
console.log("http://127.0.0.1:5888")
});