node.js中使用http模塊創建服務器和客戶端


node.js中的 http 模塊提供了創建服務器和客戶端的方法,http 全稱是超文本傳輸協議,基於 tcp 之上,屬於應用層協議。

 

一、創建http服務器

const http = require('http');

//創建一個http服務器
let server = http.createServer();
//監聽端口
server.listen(8888, '0.0.0.0');

//設置超時時間
server.setTimeout(2 * 60 * 1000);

//服務器監聽時觸發
server.on('listening', function () {
    console.log('監聽開始');
});

//接收到客戶端請求時觸發
server.on('request', function (req, res) {
    //req表示客戶端請求對象,是http.IncomingMessage類的實例,可讀流。
    //res表示服務端響應對象,是http.ServerResponse類的實例,可寫流。

    //請求方法
    console.log(req.method);
    //請求url
    console.log(req.url);
    //請求的頭信息
    console.log(req.headers);
    //請求的http版本
    console.log(req.httpVersion);
    //請求對象的socket對象
    console.log(req.socket);

    res.end('hello');
});

//連接建立時觸發
server.on('connection', function (socket) {
    console.log('建立連接');
});

//客戶端向服務器發送CONNECT請求時觸發
server.on('connect', function (req, socket, head) {
    console.log('客戶端connect');
});

//服務器關閉時觸發,調用 close() 方法。
server.on('close', function () {
    console.log('服務器關閉');
});

//發生錯誤時觸發
server.on('error', function (err) {
    console.log(err);
});

//如果連接超過指定時間沒有響應,則觸發。
//超時后,不可再復用已建立的連接,需發請求重新建立連接
server.on('timeout', function (socket) {
    console.log('連接已超時');
});

請求對象 req 里保存了客戶端的詳細信息,包括 url,請求參數等,為了方便的解析這些參數,我們可以使用 url.parse() 方法。

const http = require('http');
const url = require('url');

//創建一個http服務器
let server = http.createServer();
//監聽端口
server.listen(8888, '0.0.0.0');

//接收到客戶端請求時觸發
server.on('request', function (req, res) {

    //解析url返回一個url對象
    //如果參數二設為true,則url對象中的query屬性將通過querystring.parse()生成一個對象
    let params = url.parse(req.url, true);

    //完整url地址
    console.log('href', params.href);
    //主機名,包含端口
    console.log('host', params.host);
    //主機名,不包含端口
    console.log('hostname', params.hostname);
    //端口
    console.log('port', params.port);
    //協議
    console.log('protocol', params.protocol);
    //路徑,包含查詢字符串
    console.log('path', params.path);
    //路徑,不包含查詢字符串
    console.log('pathname', params.pathname);
    //查詢字符串,不包含 ?
    console.log('query', params.query);
    //查詢字符串,包含 ?
    console.log('search', params.search);
    //散列字符串,包含 #
    console.log('hash', params.hash);

    res.end('end');
});

響應對象 res 可以設置服務器響應給客戶端的一些參數。

const http = require('http');
const url = require('url');

//創建一個http服務器
let server = http.createServer();
//監聽端口
server.listen(8888, '0.0.0.0');

//接收到客戶端請求時觸發
server.on('request', function (req, res) {

    //設置響應頭信息
    res.setHeader('Content-Type', 'text/html;charset=utf-8');

    //獲取響應頭信息
    res.getHeader('Content-Encoding');

    res.setHeader('test', 'test');
    //刪除響應頭信息
    res.removeHeader('test');

    //判斷響應頭是否已發送
    console.log(res.headersSent ? '已發送' : '未發送');

    //注意writeHead()與setHeader()的區別,setHeader()並不會立即發送響應頭。
    //而writeHead()會發送,writeHead()設置的響應頭比setHeader()的優先。
    res.writeHead(200, {
        'aaa': 'aaa'
    });

    //判斷響應頭是否已發送
    console.log(res.headersSent ? '已發送' : '未發送');

    //如何不發送日期 Date,設置為false將不發送Date
    res.sendDate = false;

    //設置響應的超時時間
    res.setTimeout(30 * 1000);
    res.on('timeout', function () {
        console.log('響應超時');
    });

    //向客戶端發送數據
    //由於res響應對象也是一個流,所以可以使用write()來寫數據
    res.write(Buffer.from('你好'));
    res.write(Buffer.from('歡迎'));

    res.end('end');
});

  

二、http的客戶端

有些時候我們需要通過get或post去請求其它網站的資源或接口,這個時候就需要用到http客戶端了。

const http = require('http');
const zlib = require('zlib');

let client = http.request({
    //協議
    'protocol': 'http:',
    //主機名或IP
    'hostname': 'www.baidu.com',
    //端口
    'port': 80,
    //請求方式
    'method': 'GET',
    //請求路徑和查詢字符串
    'path': '/',
    //請求頭對象
    'headers': {
        'Accept-Encoding': 'gzip, deflate, br'
    },
    //超時時間
    'timeout': 2 * 60 * 1000
});

//發送請求
client.end();

//響應被接收到時觸發
client.on('response', function (res) {
    console.log('狀態嗎:' + res.statusCode);
    console.log('響應頭:' + JSON.stringify(res.headers));

    //頭信息的名稱為小寫
    let encoding = res.headers['content-encoding'];

    //判斷響應頭中的內容編碼,是否有過壓縮,如果有則進行解壓
    if (encoding.match(/\bgzip\b/)) {
        res.pipe(zlib.createGunzip()).pipe(process.stdout);
    } else if (encoding.match(/\bdeflate\b/)) {
        res.pipe(zlib.createInflate()).pipe(process.stdout);
    } else {
        res.pipe(process.stdout);
    }
});

//請求過程中出錯了觸發
client.on('error', function (err) {
    console.log(err);
});

//當 socket 被分配到請求后觸發
client.on('socket', function (socket) {
    socket.setTimeout(2 * 60 * 1000);
    socket.on('timeout', function () {
        //終止本次請求
        client.abort()
    });
});

也可以使用 http.get() 簡便方法進行 get 請求。

const http = require('http');

//會自動調用 req.end(),默認為 get 請求。
http.get('http://www.baidu.com', function (res) {
    res.on('data', function (data) {
        console.log(data.toString());
    });
});

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM