1. 程式人生 > 程式設計 >node.js使用http模組建立伺服器和客戶端完整示例

node.js使用http模組建立伺服器和客戶端完整示例

本文例項講述了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',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',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,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());
  });
});

希望本文所述對大家node.js程式設計有所幫助。