獲取http.ServerResponse對象的方式,
1.http.createServer(function(req,res){}) 其中res是http.ServerResponse對象javascript
2.var server = http.createServer().listen(9332,'localhost')
server.on('request',function(req,res){}) server的request對象的request事件中,res爲http.ServerResponse對象html
http.ServerResponse對象的方法:java
1.報頭:json
1.writeHead()跨域
2.setHeader()瀏覽器
3.getHeader(類型參數)緩存
4.removeHeader()服務器
5.addTrailers() 追加頭信息markdown
2.報文cookie
1.write() 報文內容,返回值是true/false
2.end() 結束響應,必須調用end()方法,不然是超時,沒有響應.
3.setTimeout() 服務器沒有響應時,觸發這個事件.
http.ServerResponse對象的屬性:
1.headerSent 當頭部已經有響應後,res.headerSent 爲true 不然爲false.能夠經過這個屬性來判斷是否已經響應.
2.statusCode
3.sendDate true/fasle 當爲false時,將刪除頭部時間
http.ServerResponse監聽的事件
1.timeout事件
2.close事件
3.request事件
4.checkContinue事件
5.connect事件
6.clientError事件
設置頭部信息,有兩個方法:
1.setHeader(name,value)方法能夠調用屢次,但真正寫入到頭部的必須調用一次writeHead()
2.http.ServerResponse.writeHead(statusCode[,reasonPhrase][,headers]) 其中headers 爲設置的頭對象
3.設置的頭部信息的內容:
content-type: 內容類型, [type]/[subtype]; parameter
location: 將客戶端的請求重定向
content-disposition: 指定一個被下載的文件名
content-length: 服務器響應的字段數
set-cookie:設置cookie
Cache-Control: 開啓緩存
Expires:緩存失效時間
Etag:當服務器沒有變化時,不從新下載文件
(1)content-type的類型,這是幾個大類,而後後面是具體的小類:
Text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;
Multipart:用於鏈接消息體的多個部分構成一個消息,這些部分能夠是不一樣類型的數據;
Application:用於傳輸應用程序數據或者二進制數據;
Message:用於包裝一個E-mail消息;
Image:用於傳輸靜態圖片數據;
Audio:用於傳輸音頻或者音聲數據;
Video:用於傳輸動態影像數據,能夠是與音頻編輯在一塊兒的視頻數據格式。
(2)一般還有一些設置跨域的內容:
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Headers", "X-Requested-With");
res.setHeader("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
報文信息:
在調用res.end()以前能夠屢次調用res.write()方法,res.write()返回一個true/fasle,
當沒有響應或者超時時(這種狀況遇到不少次,進程沒有掛掉,一直處在無響應,可是客戶端一直能夠請求),res.setTimeout(毫秒數,callback),當超時時,會觸發res.on(timeout,function(){}),若是沒有回調函數,則自動調用end()結束請求.
當網絡較好,數據量較少時,,將數據直接發送到上操做系統的內核緩存區,而後從內核緩存去取出數據發送給對方.返回值是true
當數據比較大,網速慢時,先將數據緩存在內存中,若是客戶端能夠接收數據了,再將數據發送到內核緩存區中,最後發送給對方.返回值是false
所以在大量數據的時候,會有內存爆滿.
這是在併發狀況下的用async作的控制,
當集合中元素不少,不能一次所有並行操做,又不想一個一個按順序來,可使用forEachLimit函數。它能夠設定一批處理幾個,每一批內並行執行,批與批之間順序執行。
async.forEachLimit(eles, 5000, (list, cb) => { // do something; });
獲取req的報文信息
經過req.對象來獲取(req對象參考上面的獲取方法)
req.屬性包含如下屬性:
1.method:客戶端請求的方法
2.url:客戶端請求的url
3.headers:請求頭對象,包含cookies和瀏覽器信息(報文)
Connection:keep-alive
Content-Length:874
Content-Type:application/json; charset=utf-8
Date:Fri, 20 Jan 2017 03:25:38 GMT
ETag:W/"36a-yQDJ0iz/THXt81YLCAOKTg"
Vary:X-HTTP-Method-Override
Via:1.0 am-forward (squid/3.1.23)
X-Cache:MISS from am-forward
X-Cache-Lookup:MISS from am-forward:3128
X-powered-by:www.yunshipei.com
accept-encoding: 'gzip, deflate, sdch' //說明瀏覽器支持的壓縮格式
httpVersion: http協議版本號
socket:客戶端監聽的socket對象
對於傳輸的壓縮的處理請參考:http://www.poluoluo.com/jzxy/201504/353581.html.這時不只要判斷content-encoding還要與客戶端協商一致.
獲取部份內容
在頭部中設置:
1.Range: bytes=5001-10000 //5001-10000字節
2.Range: bytes=5001- //5001字節之後的
3.Range: bytes=-3000,5000-7000 //從一開始到3000字節和5000-7000字節