您好,登錄后才能下訂單哦!
本文實例講述了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()); }); });
希望本文所述對大家node.js程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。