websocket与socket.io
什么是Websocket?
Websocket是一個(gè)獨(dú)立于http的實(shí)時(shí)通信協(xié)議,最初是在HTML5中被引用進(jìn)來(lái)的,在HTML5規(guī)范中作為瀏覽器與服務(wù)器的核心通信技術(shù)被嵌入到瀏覽器中。WebSocket的出現(xiàn)使得瀏覽器提供對(duì)Socket的支持成為可能,從而在瀏覽器和服務(wù)器之間提供了一個(gè)基于TCP連接的雙向通道。
在websocket誕生之前,服務(wù)端想要向客戶端推送數(shù)據(jù)只能通過(guò)客戶端向服務(wù)端主動(dòng)發(fā)送請(qǐng)求才能獲得。在構(gòu)建實(shí)時(shí)Web應(yīng)用時(shí),最常用的就是輪詢 (Polling)和Comet技術(shù),而Comet技術(shù)實(shí)際上是輪詢技術(shù)的改進(jìn),又可細(xì)分為兩種實(shí)現(xiàn)方式,一種是長(zhǎng)輪詢機(jī)制,一種稱為流技術(shù)。
輪詢:這是最早的一種實(shí)現(xiàn)實(shí)時(shí) Web 應(yīng)用的方案。客戶端以一定的時(shí)間間隔向服務(wù)端發(fā)出請(qǐng)求,以頻繁請(qǐng)求的方式來(lái)保持客戶端和服務(wù)器端的同步。
長(zhǎng)輪詢:長(zhǎng)輪詢則是針對(duì)普通輪詢的這種缺陷的一種改進(jìn)方案,其具體實(shí)現(xiàn)方式是如果當(dāng)前請(qǐng)求沒(méi)有數(shù)據(jù)可以返回,則繼續(xù)保持當(dāng)前請(qǐng)求的網(wǎng)絡(luò)連接狀態(tài),直到服務(wù)端有數(shù)據(jù)可以返回或者連接超時(shí)。長(zhǎng)輪詢通過(guò)這種方式減少了客戶端與服務(wù)端交互的次數(shù),避免了一些無(wú)謂的網(wǎng)絡(luò)連接。
流:流就是在客戶端的頁(yè)面向服務(wù)端發(fā)出一個(gè)長(zhǎng)連接的請(qǐng)求。服務(wù)器端接到這個(gè)請(qǐng)求后作出回應(yīng)并不斷更新連接狀態(tài)以保證客戶端和服務(wù)器端的連接不過(guò)期。通過(guò)這種機(jī)制可以將服務(wù)器端的信息源源不斷地推向客戶端。
綜上所述,以上這些方案實(shí)質(zhì)上都是用ajax的方法模擬實(shí)時(shí)效果,實(shí)質(zhì)上并沒(méi)有實(shí)現(xiàn)真正的實(shí)時(shí)技術(shù)。同時(shí)每一次交互都是一次http請(qǐng)求和相應(yīng)的過(guò)程,這就增加了網(wǎng)絡(luò)的負(fù)載。
?
Websocket是獨(dú)立的基于TCP的協(xié)議,其跟http協(xié)議的關(guān)系僅僅是WebSocket的握手被http服務(wù)器當(dāng)做Upgrade request http包處理。Websocket有自己的握手處理過(guò)程。
Websocket鏈接由客戶端發(fā)起握手請(qǐng)求,協(xié)議內(nèi)容如下:
1 GET /chat HTTP/1.1 2 Host: server.example.com 3 Upgrade: websocket 4 Connection: Upgrade 5 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== 6 Sec-WebSocket-Protocol: chat, superchat 7 Sec-WebSocket-Version: 13 8 Origin: http://example.com?
???????? 服務(wù)端的相應(yīng)如下:
1 HTTP/1.1 101 Switching Protocols 2 Upgrade: websocket 3 Connection: Upgrade 4 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 5 Sec-WebSocket-Protocol: chat一旦建立了連接,服務(wù)端與客戶端之間就可以以全雙工方式進(jìn)行通信。
自己在本地起了一個(gè)websocket服務(wù)端,然后創(chuàng)建了一個(gè)websocket鏈接,如下圖所示:
?
?
什么是Socket.io?
有很多人經(jīng)常講Socket.io與websocket搞混,實(shí)際上他們并不完全等同。它一個(gè)完全由JavaScript實(shí)現(xiàn)、基于Node.js、支持WebSocket協(xié)議用于實(shí)時(shí)通信、跨平臺(tái)的開(kāi)源框架,它包括了客戶端的JavaScript和服務(wù)器端的Node.js。也就是說(shuō)Socket.io將Websocket和輪詢(Polling)機(jī)制以及其它的實(shí)時(shí)通信方式封裝成了通用的接口,并且在服務(wù)端實(shí)現(xiàn)了這些實(shí)時(shí)通信機(jī)制。
Socket.io中主要使用了websocket,將輪詢作為其輔助選項(xiàng),提供的是相同的接口。其與node.js一樣,也是事件驅(qū)動(dòng)的。
?
?
參考:
http://www.websocket.org/
https://github.com/socketio/socket.io
http://socket.io/
http://blog.csdn.net/ishallwin/article/details/10299815
http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/index.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/cishengchongyan/p/6106602.html
總結(jié)
以上是生活随笔為你收集整理的websocket与socket.io的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用Spring Session做分布式
- 下一篇: Asp中解决AJAX乱码问题