第六章 理解Buffer
這一章要理解的不多,都是一些buffer的常見操作,看API就可以熟悉,如果做過後臺的就不會陌生,這裏需要注意的幾個地方就是
- Buffer所佔用的內存不是通過V8分配的,屬於堆外內存,所以意思就是其實在V8啓動的時候就會有一個Buffer對象一直常駐內存,無需通過require引入。
- Buffer的內存分配分爲小內存分配和大內存分配,小內存分配一般指的是小於 8kb 的 Buffer 的對象,大內存當然就是大於 8kb的Buffer 對象。
Buffer的轉換主要體現在字符串轉Buffer和Buffer轉字符串,字符串轉Buffer直接通過構造函數來實現。
new Buffer(str, [encording]) //encording值編碼類型
Buffer轉字符串通過 toString() 可以實現。
buf.toString([encording], [start], [end])
Buffer的性能,通過預先轉換靜態內容爲Buffer對象,可以有效減少CPU的重複使用,從而節省服務器資源。
第七章 網絡編程
這一章也比較簡單,主要分爲四個,構建TCP服務、構建UDP服務、構建HTTP服務、構建WebSocket服務,前兩個不是重點,後兩個比較常用。不多說,直接看代碼。
構建TCP服務
//示例,創建一個TCP服務器端
var net = require('net') //依賴node自帶的net模塊
var server = net.createServer(function (socket) {
//新的連接
socket.on('data', function (data) {
console.log('連上了')
})
//斷開連接
socket.on('end', function (data) {
console.log('連接斷開')
})
socket.write('創建一個TCP服務器端')
})
//監聽
server.listen(1234, function () {
console.log('已綁定1234端口號')
})
構建一個UDP服務器端和一個UDP客戶端
//示例,創建一個UDP服務器端
var dgram = require('dgram')
var server = dgram.createSocket('udp4')
server.on('message', function (msg, rinfo) {
console.log('服務器得到了' + msg + '來自' + rinfo.address + ':' + rinfo.port)
})
server.on('listening', function () {
var address = server.address()
console.log('已綁定' + rinfo.address + ':' + rinfo.port)
})
//示例,創建一個UDP客戶端,與UDP服務器端對話
var dgram = require('dgram')
var message = new Buffer('test.txt')
var client = dgram.createSocket('udp4')
//通過客戶端發送給網絡,參數分別對應 要發送的Buffer Buffer的偏移 Buffer的長度 目標端口 目標地址 完成後的回調
client.send(message, 0, message.length, 1234, 'localhost', function (err, bytes) {
client.close();
})
構建一個HTTP服務器
這個真的好熟悉,如下:
//示例,創建一個HTTP服務器, http模塊繼承於TCP中的net模塊
var http = require('http')
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'})
res.end('雷猴\n')
}).listen(1234, 'localhost')
console.log('已綁定 http://localhost:1234')
構建WebSocket服務
WebSocket也是一種基於事件的編程模型,所以和Node結合也是相得益彰,同時WebSocket實現了客戶端和服務器端之間的長連接,Node事件驅動的方式十分擅長於大量的客戶端保持高併發的連接。
//示例,WebSocket在客戶端的應用
var socket = new WebSocket('ws://localhost:1234/update')
socket.onopen = function () {
setInterval(function () {
if (socket.bufferedAmount === 0) {
socket.send(getUpdateData())
}
}, 50)
}
socket.onmessage = function (event) {
//todo: event.data 的處理
}
網絡服務與安全
還有一個關於網絡編程的便是網絡安全。node在網絡安全上提供了3個模塊,crypto、tls、https。其中crypto主要用於加密解密,tls模塊提供了與net模塊類似的功能,區別在於建立在TSL/SSL加密的TCP連接之上,https與http基本都是一致的,區別在於前者更安全。
第八章 構建Web應用
關於構建Web應用這一章,其實現有其他的框架講的而且運用的已經很詳細,比如KOA,比如Express,試着運用這兩個做一個web應用更能加深理解,這裏就總結一下構建Web應用的組成
基礎功能
- 請求方法:常見的請求方法有GET、POST、PUT、DELETE,存在於請求報文的第一行的第一個單詞,通常爲大寫。
- 路徑解析:瀏覽器將請求解析成報文,位於請求報文的第二行。
- 查詢字符串:即請求傳遞的參數。
- cookie:記錄服務器和客戶端之間的狀態。服務器端生成向客戶端發送 –> 瀏覽器保存cookie –>
每次瀏覽器發送請求都會攜帶cookie,cookie會造成帶寬浪費,所以可以減少cookie的大小,爲靜態的組件使用不同的域名,減少DNS的查詢來避免。 - session:與cookie作用類似,但是session只保留在服務器端,並且常駐內存(利用Redis或者Memcached可以統一轉移到集中的數據存儲中)。session也會有安全問題,但是相對較小,常見的漏洞就是XSS漏洞(跨站腳本攻擊)。
- 緩存:利用瀏覽器來緩存靜態資源,目的是提升加載速度從而提升體驗。
- Basic認證:請求報文頭部的Authorization,這種方式有缺陷,因爲在網絡傳輸中這些驗證接近於明文,所以不可取。
數據上傳
- 表單數據:即常見的form表單提交。
- JSON/XML: 提交的數據是JSON/XML格式的,現在大部分的交互都是用的JSON,XML的也有用,比如微信公衆號平臺的開發的交互就是用的XML,這個真的賊坑。
- 附件上傳:利用form-data來實現附件上傳。
- 數據上傳安全:數據上傳的安全性問題主要體現在內存限制和跨站僞造請求的問題上,所以一要對上傳做限制,而是在開發中要加hash值做標識,就是加一個隨機數。
路由解析
- 文件路徑型:分爲靜態文件和動態文件,不需要解釋。
- MVC:前端MVC,之前一篇博客有講,現在前端都是MV*。
- RESTful: 表述性狀態轉移,強調所有的資源都是可以通過URL訪問到,對URL做文章,與MVC不衝突。可以看下阮一峯的博客:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
中間件
- 異常處理:中間件的核心就是尾調用next(),所以對於一些異常,需要在next()添加一個參數,並且把捕獲到的異常傳遞過來。
- 性能:中間件的出現時服務於具體業務的,所以要特殊特用,性能問題並不大。
頁面渲染
- 內容響應:內容的響應主要依賴於報文中的Content-*字段,它決定了客戶端會以什麼樣的方式來作出響應,下載、跳轉等。
- 視圖渲染:一般是通過模板加數據共同生成出來的。
- 模板:比視圖渲染更進一步,模板的使用的對前端頁面的一種複用,是對html體的複用。比如javaweb中的jsp,或者PHP,當然這些都相對成熟,對於初出茅廬的node來說,現在常用的模板渲染模塊有jade,heredoc,ejs等。
前端新手,弱雞一枚,如有錯誤,請指正,謝謝!