Node.js學習筆記-03

七、網絡編程

1. 構建 TCP 服務

在這里插入圖片描述
TCP 是面向連接的協議,顯著特征 在傳輸之前需要3次握手形成會話。
客戶端 ——請求連接——> 服務器端 ——響應——> 客戶端 ——開始傳輸——> 服務器端。

2. 構建 UDP 服務

3. 構建 HTTP 服務

http模塊

在node中HTTP服務繼承自TCP服務器(net模塊),它能夠與多個客戶端保持連接,由于其采用事件驅動的形式,并不為每一個連接創建額外的線程或進程,保持很低的內存占用,所以能實現高并發。
http模塊請求流程

4. 構建 WebSocket 服務

WebSocket協議主要分為兩個部分:握手 和 數據傳輸。
(握手部分由HTTP完成,握手順利完成后當前連接將不再進行HTTP的交互,而是開始WebSocket的數據幀協議)

5. 網絡服務與安全

Node在網絡安全上提供了3個模塊,分別為 crypto、tls、https。

TLS / SSL

1、密鑰

TLS / SSL 是一對公鑰/私鑰 的結構,非對稱結構。
客戶端和服務端交換密鑰
Node 在底層采用的是 openssl 實現TLS/SSL 。

2、數字證書

TLS 服務

HTTPS 服務

6. 總結

Node基于事件驅動和非阻塞設計,在分布式環境中尤其能發揮出它的特長,基于事件驅動可以實現與大量的客戶端進行連接,非阻塞設計則讓它可以更好地提升網絡的響應吞吐。Node提供了相對底層的網絡調用,以及基于事件的編接口,使得開發者在這些模塊上十分輕松地構建網絡應用。

八、構建web應用(重點)

8.1 基礎功能

// 經典案例 Hello World
var http = require('http')
http.createServer( function (req , res){res.writeHead(200,{'Content-Type':'text/plain'});res.end('Hello World\n');
} ).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/')
// 使用 node .\helloWorld.js  運行服務,輸入地址即可訪問。

要實現更豐富的需求,一切都從如下這個函數展開:

function (req , res){res.writeHead(200,{'Content-Type':'text/plain'});res.end();
}

8.1.1 請求方法

在Web應用中最常見的請求方法是 GET 和 POST,除此之外,還有HEAD、DELETE、PUT、CONNECT等方法。
請求方法存在于報文的第一行的第一個單詞,通常大寫。如下為一個報文頭的示例:
報文頭為GET的示例

8.1.2 路徑解析

路徑部分存在于報文的第一行的第二部分,參考上圖。

8.1.3 查詢字符串

跟在路徑后面的字符串就是查詢字符串(如 ?name=nb)

Node提供了 querystring模塊用于處理這部分數據:

var querystring = require('querystring');
var query = querystring.parse( url.parse(req.url).query ); 
// 更簡介的方法是 給 url.parse()傳遞第二個參數,如下
var query2 = url.parse(req.url, true).query; 
// 它會將 name=nb&age=120 解析為一個JSON對象 {name:'nb',age:120}
// 如果鍵多次出現,那么它的值將會是一個數組 name=nb1&name=nb2 => {name:['nb1','nb2']}

8.1.4 Cookie

HTTP是一個無狀態的協議,而現實業務中卻是需要一定的狀態的,否者無法區分用戶之間的身份。如何標識和認證一個用戶,最早的方案就是Cookie。

Cookie的處理分為如下幾步:服務器向客戶端發送Cookie => 瀏覽器將Cookie保存 => 之后每次請求都會將Cookie發向服務器;

HTTP_Parser 會將所有的報文字段解析到 req.headers上,那么 Cookie 就是 req.headers.cookie
根據規范中定義 Cookie 值的格式是 key=value;key2=value2 形式的。

8.1.5 Session

問題1:Cookie可能會體積過大;問題2:Cookie可以在前后端進行修改,Cookie對敏感數據的保護可以說是無效的。Session 應運而生。

Session的數據只保留在服務器端,客戶端無法修改。這樣數據安全性得到一定保障,數據也無需在協議中每次都被傳遞。

雖然在服務器端存儲數據十分方便,如何將每個客戶和服務器中的數據一一對應呢?這里有兩種常見的實現方式:

  1. 基于 Cookie 來實現用戶和數據的映射;P195
  2. 通過查詢字符串來實現瀏覽器端和服務器端數據的對應;P195(風險大于1)
1.Session 與內存
  • Session 弊端:
  • 增加內存消耗,會引起性能問題;
  • 我們為了利用 多核CPU啟動多個進程時,用戶請求的連接將可能隨意分配到各個進程中,Node的進程與進程之間是不能直接共享內存的,用戶的Session可能會引起錯亂。
  • 為解決性能問題和Session數據無法跨進程共享的問題,常用的方案是將Session集中化,如常用的工具 Redis、Memcached等。P198
  • 盡管采用第三方緩存會引起網絡訪問,理論上比本地慢,但還是利大于弊。
2.Session 與安全

主要是指如何讓這個口令更加安全。

  1. 加密 / 解密
  2. 將客戶端的某些獨有信息與口令作為原始值然后簽名。這樣攻擊者一旦不在原始的客戶端上進行訪問就會導致簽名失敗。

8.1.6 緩存

如何節省不必要的傳輸,提高性能。

8.1.7 Basic認證

P204 --不太重要

8.2 數據上傳

8.3 路由解析

8.4 中間件

8.5 頁面渲染

8.6 總結

  • 本章涉及的內容較為豐富,在Web應用的整個構建過程中,從處理請求到響應請求的整個過程都有原理性闡述,整理本章細節就可以完成一個功能完備的Web開發框架。過去的各種Web技術,隨著框架和庫的成型,開發者往往迷糊地知道應用框架和庫,卻不知道細節的實現,這好比沒有地圖卻在野地里行進。本章的內容希望能為Node開發者帶來地圖似的啟發,在開發Web應用時能夠心有輪廓,明了細微。
  • 現在知名和成熟的Web框架有Connect、Express等,本章中的內容在這些框架中都有實現因為行文的原因,本章中的代碼實現得較為粗糙,實際使用請使用這些成熟的框架。
    P245

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35854.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35854.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35854.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Java面向對象程序設計》學習筆記——第 7 章 面向對象設計的基本原則

?專欄:《Java面向對象程序設計》學習筆記 ?# 第 7 章 面向對象設計的基本原則 7.1 UML 類圖簡介 類的 UML 圖 長方形垂直地分為三層。 第 1 層是名字層。 名字是常規字形,表明該類是具體類,如果類的名字是斜體字形,表明該類…

C語言可變數組 嵌套的可變數組,翻過了山跨過了河 又掉進了坑

可變數組 ?專欄內容: postgresql內核源碼分析 手寫數據庫toadb 并發編程 個人主頁:我的主頁 座右銘:天行健,君子以自強不息;地勢坤,君子以厚德載物. 概述 數組中元素是順序存放,這一特性讓我們…

【IC萌新虛擬項目】spt_core模塊基于dc的綜合環境搭建與面積時序優化

關于整個虛擬項目,請參考: 【IC萌新虛擬項目】Package Process Unit項目全流程目錄_尼德蘭的喵的博客-CSDN博客 前言 當驗證的同學正在瘋狂寫測試點,補充測試用例各種找茬找bug時候,設計的同學也要進入到跑綜合修時序優化面積的階段了。 還是老樣子,關于芯片綜合的知識就…

Redis_緩存3_緩存異常(數據不一致、雪崩、擊穿、穿透)

14.6緩存異常 四個方面 緩存中數據和數據庫不一致緩存雪崩緩存擊穿緩存穿透 14.6.1數據不一致: 一致性包括兩種情況 緩存中有數據,需要和數據庫值相同緩存中沒有數據,數據庫中的數據是最新值 如果不符合以上兩種情況,則出現…

Linux tee

tee 是一個命令行工具,它可以從標準輸入讀取數據,并將其同時輸出到標準輸出和指定的文件中。tee 命令非常實用,特別是在需要同時查看輸出內容和將其保存到文件中的情況下。 tee 命令的基本語法如下: command | tee [options] [f…

Mysql 搭建MHA高可用架構,實現自動failover,完成主從切換

目錄 自動failover MHA: MHA 服務 項目:搭建Mysql主從復制、MHA高可用架構 實驗項目IP地址配置: MHA下載地址 項目步驟: 一、修改主機名 二、編寫一鍵安裝mha node腳本和一鍵安裝mha mangaer腳本,并執行安裝 …

docker容器限定ip訪問

docker容器限定ip訪問 一、測試所需環境:二、使用docker的 iptables 策略三、Docker使用iptables 與系統Firewalld之間的關系四、沖突解決方案 一、測試所需環境: 主機1: ip:192.168.3.117 環境配置:docker、httpd(do…

你真的了解ORM嗎?通過一個簡單的例子來學習ORM

什么是ORM ORM(Object-Relational Mapping)是一種將面向對象程序數據模型與關系數據庫之間進行映射的技術。 比如數據庫表user,它有id、name、age字段映射到Java實體類就是User類,有id、name、age屬性。 CREATE TABLE user (id…

2023國賽 高教社杯數學建模ABCDE題思路匯總分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 (賽題出來以后第一時間在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…

echarts加釣魚島赤尾嶼(vue)(親測有效)

1.首先引入json文件,node_modules/echarts中就有 import chinaData from "../../node_modules/echarts/map/json/china.json" 2.初始化地圖,在初始化地圖的時候加入釣魚島和赤尾嶼的數據,在chinaData下的features中加入即可&#x…

Design-Pattern設計模式

Design-Pattern設計模式 圖說設計模式 圖說設計模式 在線書籍 軟件模式是將模式的一般概念應用于軟件開發領域,即軟件開發的 總體指導思路或參照樣板。軟件模式并非僅限于設計模式,還包括 架構模式、分析模式和過程模式等,實際上&#xff…

FFmpeg常見命令行(四):FFmpeg流媒體

前言 在Android音視頻開發中,網上知識點過于零碎,自學起來難度非常大,不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》,結合我自己的工作學習經歷,我準備寫一個音視頻系列blog。本文是音視頻系…

leetcode做題筆記77組合

給定兩個整數 n 和 k,返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 思路一:直接求出組合數將每個組合放進數組中 int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {int size 0, num 1, i;in…

Rust中的智能指針:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>

Rust中的智能指針是什么 智能指針(smart pointers)是一類數據結構,是擁有數據所有權和額外功能的指針。是指針的進一步發展 指針(pointer)是一個包含內存地址的變量的通用概念。這個地址引用,或 ” 指向”…

UML 類圖的畫法

1.類圖的畫法 類 整體是個矩形,第一層類名,第二層屬性,第三層方法。 :public- : private# : protected空格: 默認的default 對應的類寫法。 public class Student {public String name;public Integer age;protected I…

2023杭電第七場補題報告1002 1004 1011 1013

2023杭電第七場補題報告1002 1004 1011 1013 1002 B. Random Nim Game (hdu.edu.cn) 思路 手推一下就可以發現其實除了一次必定結束的其他情況概論都是 1 2 \frac{1}{2} 21? 代碼 #include <bits/stdc.h> using namespace std; #define int long long void solve()…

【hello C++】特殊類設計

目錄 一、設計一個類&#xff0c;不能被拷貝 二、設計一個類&#xff0c;只能在堆上創建對象 三、設計一個類&#xff0c;只能在棧上創建對象 四、請設計一個類&#xff0c;不能被繼承 五、請設計一個類&#xff0c;只能創建一個對象(單例模式) C&#x1f337; 一、設計一個類&…

Sentinel使用實例

不說了&#xff0c;直接上官方文檔 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md Sentinel Example 項目說明 本項目演示如何使用 Sentinel starter 完成 Spring Clo…

【金融量化】對企業進行估值的方法有哪些?

估值的方法有哪些&#xff1f; 如何對企業進行估值&#xff1f;有2個方法估算。 1 絕對估值法 它是一種定價模型&#xff0c;用于計算企業的內在價值。 比如說你可以根據公司近N年的現金流情況。借此去預測未來N年的現金流情況。所有的現金流數據都可以在年報上查詢到。最后…

ios 知識

IOS 類文件.h和.m中interface的區別 大家都知道我們在創建類文件時會發現&#xff1a; #import <UIKit/UIKit.h>interface ViewController : UIViewControllerend和 #import "ViewController.h"interface ViewController ()end那么他們之間有何區別呢&#x…