在直播中,創建房間,獲取房間,都需要服務器,因此需要搭建Web服務器
Web服務器
- 能處理HTTP請求的服務器都可以叫Web服務器
Node.js介紹
- Node.js什么時候出現,2009年,Ryan Dahl(瑞恩·達爾)在GitHub上發布了最初版本的部分Node.js包,隨后幾個月里,有人開始使用Node.js開發應用
- 什么是Node.js,做過Javascript開發的,看到Node.js這個名字,初學者可能會誤以為這是一個Javascript應用,事實上,Node.js采用C++語言編寫而成,是一個Javascript的運行環境,意思就是底層使用c++編寫,外層封裝采用Javascript,需要使用Javascript解析執行。
- 比如OC底層也是c++,但是執行代碼,只需要解析OC代碼。
- Node.js是一個后端的Javascript運行環境,這意味著你可以編寫服務器端的Javascript代碼,交給Node.js來解釋執行。
Node.js工作原理與優缺點(了解一門語言的開始)
傳統Web服務器原理(T)
:傳統的網絡服務技術,是每個新增一個連接(請求)便生成一個新的線程,這個新的線程會占用系統內存,最終會占掉所有的可用內存。Node.js工作原理(T)
:只運行在一個單線程中,使用非阻塞的異步 I/O 調用,所有連接都由該線程處理,也就是一個新的連接,不會開啟新的線程,僅僅一個線程去處理多個請求。優缺點
:- 傳統的比較消耗內存,Node.js只開啟一個線程,大大減少內存消耗。
- 假設是普通的Web程序,新接入一個連接會占用 2M 的內存,在有 8GB RAM的系統上運行時, 算上線程之間上下文切換的成本,并發連接的最大理論值則為 4000 個。這是在傳統 Web服務端技術下的處理情況。而 Node.js 則達到了約 1M 一個并發連接的拓展級別
- Node.js弊端:大量的計算可能會使得 Node 的單線程暫時失去反應, 并導致所有的其他客戶端的請求一直阻塞, 直到計算結束才恢復正常
- 疑問?Node.js是單線程的。單線程怎么開啟異步?怎么工作的? 需要了解事件驅動。
- 什么是事件驅動?(T)
- 傳統的web server多為基于線程模型。你啟動Apache或者什么server,它開始等待接受連接。當收到一個連接,server保持連接連通直到頁面或者什么事務請求完成。如果他需要花幾微妙時間去讀取磁盤或者訪問數據庫,web server就阻塞了IO操作(這也被稱之為阻塞式IO).想提高這樣的web server的性能就只有啟動更多的server實例。
- Node.Js使用事件驅動模型,當web server接收到請求,就把它關閉然后進行處理,然后去服務下一個web請求。當這個請求完成,它被放回處理隊列,當到達隊列開頭,這個結果被返回給用戶。這個模型非常高效可擴展性非常強,因為webserver一直接受請求而不等待任何讀寫操作。(這也被稱之為非阻塞式IO或者事件驅動IO)
- 本質:當然最終處理事件還是需要底層開啟線程,只不過接受請求只用一個線程去接收。
Node.js使用介紹
- Node.js使用Module模塊去劃分不同的功能,以簡化App開發,Module就是庫,跟組件化差不多,一個功能一個庫。
- NodeJS內建了一個HTTP服務器,可以輕而易舉的實現一個網站和服務器的組合,不像PHP那樣,在使用PHP的時候,必須先搭建一個Apache之類的HTTP服務器,然后通過HTTP服務器的模塊加載CGI調用,才能將PHP腳本的執行結果呈現給用戶
- require() 函數,用于在當前模塊中加載和使用其他模塊;
Express模塊(框架)
- Express是Node.JS第三方庫
- Express可以處理各種HTTP請求
- Express是目前最流行的基于Node.js的Web開發框架,
- Express框架建立在node.js內置的http模塊上,可以快速地搭建一個Web服務器
- Express官方文檔
- Javascript文檔.aspx)
請點擊此處輸入圖片描
搭建Web服務器步驟
一、安裝Node.JS
- 打開終端,輸入node -v,先查看是否已經安裝
- 如果沒有安裝,就需要安裝node軟件。
- mac上可以使用Homebrew,安裝node
- Homebrew:Homebrew簡稱brew,是Mac OSX上的軟件包管理工具,能在Mac中方便的安裝軟件或者卸載軟件,相當于window上360管家,可以幫你下載軟件。
- 先輸入brew -v,查看mac是否安裝了HomeBrew
- 安裝ruby教程(http://www.jianshu.com/p/daa92187621c)
- 使用ruby安裝Homebrew,前提是安裝了ruby
- 輸入指令安裝brew


使用Homebrew安裝Node,輸入指令


- 安裝完,輸入`node -v“查看是否安裝成功二、安裝NPM
- NPM是隨同NodeJS一起安裝的包管理工具,用于下載NodeJS第三方庫。
- 類似iOS開發中cocoapods,用于安裝第三方框架
新版的NodeJS已經集成了npm,所以只要安裝好Node.JS就好
三、利用NPM下載第三方模塊(Express和Socket.IO)
- package.json
- package.json類似cocoapods中的Podfile文件
- package.json文件描述了下載哪些第三方框架.
- 可以使用npm init創建
- 需要添加dependencies字段,描述添加哪些框架,其他字段隨便填
- 注意:不能有中文符號


四、執行npm install,就會自動下載依賴庫


五、創建Node.JS文件,搭建服務器
- 只要文件,以js為后綴就可以了,比如app.js
- 使用node app.js 就能執行文件
- 注意點:監聽端口要注意,不能使用已經占用的端口比如(80),每個服務器相當于一個app,都需要端口,才能找到入口
六、簡單的搭建Http服務器


七、express框架
- 直接創建express應用,就是服務器,可以直接監聽
- 需要主動監聽請求,get,post


八、路由
- 路由:如何響應客戶端的請求
- 添加url路徑,根據不同路徑,顯示不同內容
- 訪問地址,/home應該往端口后拼接,8080/home


路由句柄(索引):執行完一個函數,接著執行下一個 ,因為有時候處理一個請求,需要做很多其他事情,寫在一起業務邏輯不好分開,所以多弄幾個行數


九、中間件
- 優化代碼,使代碼清晰可讀
- 注意點,函數一定要添加next參數,一定要調用next(),才會進行下面操作,代碼使一行一行執行,解釋性語言
- 原理,發送一個請求給服務器的時候,會被中間件攔截,先由中間件處理,每個中間件都有一個回調函數作為參數
- use是express注冊中間件的方法


- 代碼演示


十、get請求參數
- request.query會把請求參數包裝成字典對象,直接通過點就能獲取參數


十一、post請求參數
- 使用http發送請求,需要設置content-type字段
- content-type字段2.1 application/x-www-form-urlencoded(普通請求,默認一般使用這種)2.2 application/json(帶有json格式的參數,需要使用這個,比如參數是字典或者數組)2.3 multipart/form-data(傳輸文件,文件上傳使用這個)
- AFN框架中AFHTTPRequestSerializer使用的是application/x-www-form-urlencoded,AFJSONRequestSerializer使用的是application/json
- Node.JS需要使用body-parser模塊,解析post請求參數,安裝body-parser模塊,用命令行


可以采用中間件的方式解析post請求參數
5.1 注意bodyParser.urlencoded參數是一個字典,需要添加`{}“包裝,bodyParser.urlencoded({extends:true})
5.2 extends必傳參數,是否展開


- 完整代碼


十二、express創建對象返回客戶端
- {}:字典 []:數組
- 自定義對象,才有function
- function可以定義函數,也可以定義對象,一般有屬性的,都是對象
- 定義對象,this:表示當前對象,類似self
- 對象可以直接輸出




十三、express模塊開發
- 如果把所有代碼寫在一個文件中,不好維護,代碼可讀性不好,最好分離文件
- 使用模塊開發,exports用來定義模塊接口,可以定義函數,也可以定義自定義對象,需要用module.exports
- 注意,module.exports和exports不能重復,重復以module.exports為準
- 路徑問題: ./ : 表示當前文件
- main.js


- User.js


十四、字典和數組刪除操作
- 刪除數組splice,splice有2兩個參數,第一個參數,從哪個角標開始 第二個參數,刪除幾個元素
- 刪除字典delete
- 注意:delete刪除數組,刪除不干凈,只是把元素刪除,當前角標位置并不會移除
- [1,2,3] 比如delete arr[0] => [,2,3]


十四、直播房間服務器搭建
- 創建package.json,安裝express模塊
- 設計服務器接口和客戶端怎么交互
- 直播房間業務邏輯3.1 主播主動開啟房間3.2 通知服務器開啟房間了3.3 服務器保存房間3.4 觀眾打開房間,查看直播3.5 主播關閉直播,通知服務器移除房間號
- 服務器處理4.1 主播開啟房間,創建房間,需要傳入給服務器保存4.2 服務器用什么保存房間名稱,數組還是字典4.3 應該使用字典存儲,當主播關閉房間時,可以根據房間號,找到服務器對應的房間號刪除。4.4 添加房間,刪除房間之后,服務器應該把最新的房間信息返回給客戶端展示4.5 服務器可以直接返回房間字典,但是這樣客戶端必須自己處理下,服務器最好返回房間數組4.6 Object.keys(rooms),傳入一個字典,就能獲取字典中所有keys,返回一個數組4.7 然后遍歷keys數組,一個一個取出對應的value,在保存到數組中4.8 可以使用map函數,讓數組中所有元素執行一個方法,然后會自動把處理結果包裝成數組.4.9 map函數原理,就是遍歷數組中元素,一個一個執行,map函數的參數就是一個函數,,這個函數的參數就是數組中的一個元素key,map需要有返回值,返回值就是key參數的處理結果,會自動把處理結果包裝到新數組,然后再統一返回處理好的數組


- 客戶端處理5.1 房間模型(ID,房間名稱)5.2 保存到服務器字典,ID作為Key,房間名稱作為Value5.3 在發送服務器的時候,需要把ID和Value傳給服務器5.4 搞兩個參數(一個roomID,一個roomName)
服務器代碼




版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
發表評論
請登錄后評論...
登錄后才能評論