亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

node.js使用http模塊創(chuàng)建服務(wù)器和客戶端完整示例

 更新時(shí)間:2020年02月10日 11:25:41   作者:懷素真  
這篇文章主要介紹了node.js使用http模塊創(chuàng)建服務(wù)器和客戶端,結(jié)合完整示例形式分析了node.js基于http模塊實(shí)現(xiàn)客戶端與服務(wù)器端交互的相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了node.js使用http模塊創(chuàng)建服務(wù)器和客戶端。分享給大家供大家參考,具體如下:

node.js中的 http 模塊提供了創(chuàng)建服務(wù)器和客戶端的方法,http 全稱是超文本傳輸協(xié)議,基于 tcp 之上,屬于應(yīng)用層協(xié)議。

一、創(chuàng)建http服務(wù)器

const http = require('http');
//創(chuàng)建一個(gè)http服務(wù)器
let server = http.createServer();
//監(jiān)聽(tīng)端口
server.listen(8888, '0.0.0.0');
//設(shè)置超時(shí)時(shí)間
server.setTimeout(2 * 60 * 1000);
//服務(wù)器監(jiān)聽(tīng)時(shí)觸發(fā)
server.on('listening', function () {
  console.log('監(jiān)聽(tīng)開(kāi)始');
});
//接收到客戶端請(qǐng)求時(shí)觸發(fā)
server.on('request', function (req, res) {
  //req表示客戶端請(qǐng)求對(duì)象,是http.IncomingMessage類的實(shí)例,可讀流。
  //res表示服務(wù)端響應(yīng)對(duì)象,是http.ServerResponse類的實(shí)例,可寫(xiě)流。
  //請(qǐng)求方法
  console.log(req.method);
  //請(qǐng)求url
  console.log(req.url);
  //請(qǐng)求的頭信息
  console.log(req.headers);
  //請(qǐng)求的http版本
  console.log(req.httpVersion);
  //請(qǐng)求對(duì)象的socket對(duì)象
  console.log(req.socket);
  res.end('hello');
});
//連接建立時(shí)觸發(fā)
server.on('connection', function (socket) {
  console.log('建立連接');
});
//客戶端向服務(wù)器發(fā)送CONNECT請(qǐng)求時(shí)觸發(fā)
server.on('connect', function (req, socket, head) {
  console.log('客戶端connect');
});
//服務(wù)器關(guān)閉時(shí)觸發(fā),調(diào)用 close() 方法。
server.on('close', function () {
  console.log('服務(wù)器關(guān)閉');
});
//發(fā)生錯(cuò)誤時(shí)觸發(fā)
server.on('error', function (err) {
  console.log(err);
});
//如果連接超過(guò)指定時(shí)間沒(méi)有響應(yīng),則觸發(fā)。
//超時(shí)后,不可再?gòu)?fù)用已建立的連接,需發(fā)請(qǐng)求重新建立連接
server.on('timeout', function (socket) {
  console.log('連接已超時(shí)');
});

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

const http = require('http');
const url = require('url');
//創(chuàng)建一個(gè)http服務(wù)器
let server = http.createServer();
//監(jiān)聽(tīng)端口
server.listen(8888, '0.0.0.0');
//接收到客戶端請(qǐng)求時(shí)觸發(fā)
server.on('request', function (req, res) {
  //解析url返回一個(gè)url對(duì)象
  //如果參數(shù)二設(shè)為true,則url對(duì)象中的query屬性將通過(guò)querystring.parse()生成一個(gè)對(duì)象
  let params = url.parse(req.url, true);
  //完整url地址
  console.log('href', params.href);
  //主機(jī)名,包含端口
  console.log('host', params.host);
  //主機(jī)名,不包含端口
  console.log('hostname', params.hostname);
  //端口
  console.log('port', params.port);
  //協(xié)議
  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');
});

響應(yīng)對(duì)象 res 可以設(shè)置服務(wù)器響應(yīng)給客戶端的一些參數(shù)。

const http = require('http');
const url = require('url');
//創(chuàng)建一個(gè)http服務(wù)器
let server = http.createServer();
//監(jiān)聽(tīng)端口
server.listen(8888, '0.0.0.0');
//接收到客戶端請(qǐng)求時(shí)觸發(fā)
server.on('request', function (req, res) {
  //設(shè)置響應(yīng)頭信息
  res.setHeader('Content-Type', 'text/html;charset=utf-8');
  //獲取響應(yīng)頭信息
  res.getHeader('Content-Encoding');
  res.setHeader('test', 'test');
  //刪除響應(yīng)頭信息
  res.removeHeader('test');
  //判斷響應(yīng)頭是否已發(fā)送
  console.log(res.headersSent ? '已發(fā)送' : '未發(fā)送');
  //注意writeHead()與setHeader()的區(qū)別,setHeader()并不會(huì)立即發(fā)送響應(yīng)頭。
  //而writeHead()會(huì)發(fā)送,writeHead()設(shè)置的響應(yīng)頭比setHeader()的優(yōu)先。
  res.writeHead(200, {
    'aaa': 'aaa'
  });
  //判斷響應(yīng)頭是否已發(fā)送
  console.log(res.headersSent ? '已發(fā)送' : '未發(fā)送');
  //如何不發(fā)送日期 Date,設(shè)置為false將不發(fā)送Date
  res.sendDate = false;
  //設(shè)置響應(yīng)的超時(shí)時(shí)間
  res.setTimeout(30 * 1000);
  res.on('timeout', function () {
    console.log('響應(yīng)超時(shí)');
  });
  //向客戶端發(fā)送數(shù)據(jù)
  //由于res響應(yīng)對(duì)象也是一個(gè)流,所以可以使用write()來(lái)寫(xiě)數(shù)據(jù)
  res.write(Buffer.from('你好'));
  res.write(Buffer.from('歡迎'));
  res.end('end');
});

二、http的客戶端

有些時(shí)候我們需要通過(guò)get或post去請(qǐng)求其它網(wǎng)站的資源或接口,這個(gè)時(shí)候就需要用到http客戶端了。

const http = require('http');
const zlib = require('zlib');
let client = http.request({
  //協(xié)議
  'protocol': 'http:',
  //主機(jī)名或IP
  'hostname': 'www.baidu.com',
  //端口
  'port': 80,
  //請(qǐng)求方式
  'method': 'GET',
  //請(qǐng)求路徑和查詢字符串
  'path': '/',
  //請(qǐng)求頭對(duì)象
  'headers': {
    'Accept-Encoding': 'gzip, deflate, br'
  },
  //超時(shí)時(shí)間
  'timeout': 2 * 60 * 1000
});
//發(fā)送請(qǐng)求
client.end();
//響應(yīng)被接收到時(shí)觸發(fā)
client.on('response', function (res) {
  console.log('狀態(tài)嗎:' + res.statusCode);
  console.log('響應(yīng)頭:' + JSON.stringify(res.headers));
  //頭信息的名稱為小寫(xiě)
  let encoding = res.headers['content-encoding'];
  //判斷響應(yīng)頭中的內(nèi)容編碼,是否有過(guò)壓縮,如果有則進(jìn)行解壓
  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);
  }
});
//請(qǐng)求過(guò)程中出錯(cuò)了觸發(fā)
client.on('error', function (err) {
  console.log(err);
});
//當(dāng) socket 被分配到請(qǐng)求后觸發(fā)
client.on('socket', function (socket) {
  socket.setTimeout(2 * 60 * 1000);
  socket.on('timeout', function () {
    //終止本次請(qǐng)求
    client.abort()
  });
});

也可以使用 http.get() 簡(jiǎn)便方法進(jìn)行 get 請(qǐng)求。

const http = require('http');
//會(huì)自動(dòng)調(diào)用 req.end(),默認(rèn)為 get 請(qǐng)求。
http.get('http://www.baidu.com', function (res) {
  res.on('data', function (data) {
    console.log(data.toString());
  });
});

希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • linux 后臺(tái)運(yùn)行node服務(wù)指令方法

    linux 后臺(tái)運(yùn)行node服務(wù)指令方法

    今天小編就為大家分享一篇linux 后臺(tái)運(yùn)行node服務(wù)指令方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Node文件操作匯總實(shí)例詳解

    Node文件操作匯總實(shí)例詳解

    這篇文章主要為大家介紹了Node文件操作匯總實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • node中IO以及定時(shí)器優(yōu)先級(jí)詳解

    node中IO以及定時(shí)器優(yōu)先級(jí)詳解

    這篇文章主要給大家介紹了關(guān)于node中IO以及定時(shí)器優(yōu)先級(jí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用node具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • node?NPM庫(kù)qs?iconv-lite字符串編碼轉(zhuǎn)換及解析URL查詢學(xué)習(xí)

    node?NPM庫(kù)qs?iconv-lite字符串編碼轉(zhuǎn)換及解析URL查詢學(xué)習(xí)

    這篇文章主要為大家介紹了node?NPM庫(kù)之qs解析URL查詢字符串及iconv-lite字符串編碼轉(zhuǎn)換學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • 淺談Node.js 子進(jìn)程與應(yīng)用場(chǎng)景

    淺談Node.js 子進(jìn)程與應(yīng)用場(chǎng)景

    這篇文章主要介紹了淺談Node.js 子進(jìn)程與應(yīng)用場(chǎng)景,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 解析Node.js異常處理中domain模塊的使用方法

    解析Node.js異常處理中domain模塊的使用方法

    這篇文章主要介紹了Node.js異常處理中domain模塊的使用方法,文中最后提到了內(nèi)存泄漏的相關(guān)問(wèn)題,值得注意,需要的朋友可以參考下
    2016-02-02
  • Node.js16.15.1的一個(gè)報(bào)錯(cuò)以及解決方案分享

    Node.js16.15.1的一個(gè)報(bào)錯(cuò)以及解決方案分享

    這篇文章主要給大家介紹了關(guān)于Node.js16.15.1的一個(gè)報(bào)錯(cuò)以及解決方案的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Nodejs進(jìn)階之服務(wù)端字符編解碼和亂碼處理

    Nodejs進(jìn)階之服務(wù)端字符編解碼和亂碼處理

    這篇文章主要介紹了Nodejs進(jìn)階之服務(wù)端字符編解碼和亂碼處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 學(xué)習(xí) NodeJS 第八天:Socket 通訊實(shí)例

    學(xué)習(xí) NodeJS 第八天:Socket 通訊實(shí)例

    本篇文章主要介紹了學(xué)習(xí) NodeJS 第八天:Socket 通訊實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • 一步步教你使用node搭建一個(gè)小頁(yè)面

    一步步教你使用node搭建一個(gè)小頁(yè)面

    最近使用NodeJs搭建的小型web應(yīng)用,所以下面這篇文章主要給大家介紹了關(guān)于使用node搭建一個(gè)小頁(yè)面的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論