準(zhǔn)備:如果不太了解網(wǎng)絡(luò)的朋友可以先看一下我之前寫的文章 需要了解的網(wǎng)絡(luò)協(xié)議 。
想必大家再做即時(shí)通訊業(yè)務(wù)或需要替代輪訓(xùn)的時(shí)候,肯定聽說(shuō)過(guò) WebSocket 和 Socket 這兩個(gè)東西,我們今天就來(lái)簡(jiǎn)單說(shuō)一下這兩者的區(qū)別。
WebSocket 是一種在單個(gè) TCP 連接上進(jìn)行全雙工通信的協(xié)議。WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次 HTTP 握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
一般情況下我們使用 HTTP 有一個(gè)很大的缺陷,就是 HTTP 只能由客戶端來(lái)主動(dòng)發(fā)起,如果有需要服務(wù)端主動(dòng)通知的業(yè)務(wù),就需要輪訓(xùn)。輪詢的效率低,非常浪費(fèi)資源。為了解決 Web 端即時(shí)通訊的需求就出現(xiàn)了 WebSocket。
WebSocket(2)--為什么引入WebSocket協(xié)議
WebSocket 最早是在 HTML5 標(biāo)準(zhǔn)中的一部分,基本現(xiàn)代瀏覽器都是支持的,都可以直接使用。雖然是 HTML5 的一部分,但是在瀏覽器之外也有相應(yīng)的實(shí)現(xiàn)。比如 Socket.io 這個(gè)庫(kù)支持 Java、C++、Swift、Datr ,Python 的 ws4py,C++ 的WebSocket++ 等等。 服務(wù)端主流的 Web 容器如 Apache、Nginx、Tomcat 也都支持 WebSocket,還有 WebSocket 服務(wù)端框架如 websocketd 等。
操作系統(tǒng)中也有使用到 Socket 這個(gè)概念用來(lái)進(jìn)行進(jìn)程間通信,它和通常說(shuō)的基于 TCP/IP 的 Socket 概念十分相似,代表了在操作系統(tǒng)中傳輸數(shù)據(jù)的兩方,只是它不再基于網(wǎng)絡(luò)協(xié)議,而是操作系統(tǒng)本身的文件系統(tǒng)。
網(wǎng)絡(luò)中的 Socket 并不是什么協(xié)議,而是為了使用 TCP,UDP 而抽象出來(lái)的一層 API,它是位于應(yīng)用層和傳輸層之間的一個(gè)抽象層。Socket 是對(duì) TCP/IP 的封裝;HTTP 是轎車,提供了封裝或者顯示數(shù)據(jù)的具體形式;Socket 是發(fā)動(dòng)機(jī),提供了網(wǎng)絡(luò)通信的能力。在 Unix 一切皆文件哲學(xué)的思想下,Socket 是一種'打開—讀/寫—關(guān)閉'模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)'文件',在建立連接打開后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。所以如果你想基于 TCP/IP 來(lái)構(gòu)建服務(wù),那么 Socket API 可能就是你會(huì)接觸到的API。
正如如上所說(shuō):
聯(lián)系客服