node基礎學習——http基礎知識
<一> HTTP基礎createServer()相關事件介紹
1. 創建HTTP服務器
server = http.createServer([requestListener])
// 下面的介紹都會使用server創建的服務器對象
// requestListener為一個回調函數 => function(request,response){ ... }
參數介紹: request客戶端向服務器發送請求,response服務器響應客戶端的請求,發送內容給客戶端。
如果不使用createServer()裏面的回調函數,可以通過監聽該方法創建服務器對象request事件(當接收到客戶端請求時觸發)。
server.on(‘request‘,function(request,response){ // 回調函數代碼 })
2. listen監聽端口
server.listen(prot,[host],[backlog],[callback])
參數介紹:
port參數值用於指定需要監聽的端口號,參數值為0時將為HTTP服務器隨機分配一個端口號;
host參數用於指定需要監聽的地址,如果省略該參數,服務器將監聽來自任何IPV4地址的客戶端鏈接;
backlog參數值為一個整數,用於指定位於等待隊列中的客戶端連接的最大數量,一旦超過這個整數值,HTTP服務器將開始拒絕來自新的客戶端連接,該參數的默認最大參數值511;
當對HTTP服務器指定了需要監聽的地址及端口後,服務器將立即開始監聽來自該地址及端口的客戶端連接,這時觸發該服務器的listening事件,可用listen方法的callback參數來指定listening事件觸發時調用的回調函數,也可以使用
server.on(‘listening‘,function(){ // 回調函數 })
3. 可以使用HTTP服務器的close方法關閉該服務器,方法如下
server.close();
當服務器被關閉時,觸發服務器的close事件,可以通過監聽該事件並指定回調函數的方法來指定當服務器被關閉時所需執行的處理。
server.on(‘close‘,function(){ // 回調函數 });
4. 在對HTTP服務器指定需要監聽的地址及端口號,如果該地址及端口號被占用,將產生一個錯誤代碼"EADDRINUSE"的錯誤(表示用於監聽的地址及端口號被占用),同時將觸發HTTP服務器對象error事件。
server.on(‘error‘,function(e){ if(e.code === ‘EADDRINUSE‘){ // 可以在此出指定當地址及端口號被占用所需執行的處理 } })
5. 在默認情況下,客戶端和服務器每進行一次HTTP操作,都將建立一次連接,客戶端與服務器之間的交互通信完成後該連接中斷。在HTTP1.1中,添加來長連接支持。如果客戶端發出的請求頭信息或者服務器發出的響應頭信息中加入了“Connection:keep-alive”信息,則HTTP連接將繼續保持連接,客戶端可以繼續通過相同的連接向服務器端發出請求。
6. 在Node.js中,當客戶端與服務器端建立連接時,觸發HTTP服務器對象的connection事件,可以通過監聽該事件並在該事件觸發時調用的回調函數中指定當連接建立時所需要執行的操作
server.on(‘connection‘function(){ // 回調函數 })
備註:瀏覽器中訪問HTTP服務器時,瀏覽器會發出兩次客戶單請求,一次時用戶發出的請求,另一次是瀏覽器為頁面在收藏夾中的顯示圖標(默認為facicon.ico)而自動發出的請求。
7. 可以使用HTTP服務器的setTimeout方法來設置服務器的超時時間。當該超時時間超過之後,客戶端不可繼續利用本次與HTTP服務器建立的連接
server.setTimeout(msecs,callback)
參數介紹:mecs為一個整數值,用於設置服務器的超時時間,單位為毫秒。可以通過該參數值設置為0的方法取消服務器的超時處理
callback參數用於設置當服務器超時時調用的回調函數,在該回調函數中可以使用一個參數,參數值為服務器用於監聽客戶端請求的socket對象。
當服務器超時時,觸發該服務器對象的timeout事件,也可以不用在setTimeout方法中使用回調callback函數,而是通過監聽timeout事件
server.on(‘timeout‘,function(){ // 回調函數 })
另外,服務器擁有一個timeout屬性,屬性值為整數,單位毫秒,可用於查看或者修改服務器的超時時間。
<二> 獲取客戶端請求信息
HTTP服務器接收到客戶端請求時調用的回調函數中的第一個參數值為一個http.IncomeingMessage對象,該對象用於讀取客戶端請求流中的數據,因此,當從客戶端請求流中讀取到新的數據時觸發data事件,當讀取完客戶端請求流中的數據時觸發end事件。
例子中get/post用法只是參考,關於模塊url和mkquery-string請查看Node.js GET/POST對應的url/query-string常用的方法介紹
var url = require(‘url‘); var queryString = require(‘query-string‘); var http = require(‘http‘); http.createServer(function (req, res) { // 1.get var obj = url.parse(req.url,true); var urlStr = obj.pathname; var GET = obj.query; // 2.post let str = ‘‘; let POST = null; req.on(‘data‘,function (data) { str += data; }); req.on(‘end‘,function () { POST = queryString.parse(str); console.log(POST); }); }).listen(9696);
node基礎學習——http基礎知識