node.js使用http模組建立伺服器和客戶端完整示例
阿新 • • 發佈:2020-02-11
本文例項講述了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程式設計有所幫助。