node : 8 网络模块

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服务器

步骤:

  1. 启动server
  2. 监听
  3. 设置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")
});

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值