1.解釋W(xué)ebSocket,socketio
WebSocket:是一個(gè)標(biāo)準(zhǔn)網(wǎng)絡(luò)傳輸協(xié)議
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duplex)通信——可以通俗的解釋為服務(wù)器主動(dòng)發(fā)送信息給客戶端。是HTML5規(guī)范中的新特性.
優(yōu)點(diǎn):它提供了單個(gè)tcp連接上的雙向通信.
由于WebSocket是真正意義上的雙向通信(與輪詢,阻塞模擬長(zhǎng)連接不同),它完全減少了頻繁的身份驗(yàn)證等不必要的開(kāi)銷。WebSocket可以看作HTTP上的一個(gè)擴(kuò)展,用到了HTTP的內(nèi)容,但是和HTTP協(xié)議有著本質(zhì)上的不同。
在實(shí)現(xiàn)websocket連線過(guò)程中,需要通過(guò)瀏覽器發(fā)出websocket連線請(qǐng)求,然后服務(wù)器發(fā)出回應(yīng),這個(gè)過(guò)程通常稱為“握手” (handshaking)。在WebSocket API,瀏覽器和服務(wù)器只需要做一個(gè)握手的動(dòng)作,然后,瀏覽器和服務(wù)器之間就形成了一條快速通道。兩者之間就直接可以數(shù)據(jù)互相傳送。在此WebSocket協(xié)議中,為我們實(shí)現(xiàn)即時(shí)服務(wù)帶來(lái)了兩大好處:
1. Header
互相溝通的Header是很小的-大概只有2 Bytes
2. Server Push
服務(wù)器的推送,服務(wù)器不再被動(dòng)的接收到瀏覽器的request之后才返回?cái)?shù)據(jù),而是在有新數(shù)據(jù)時(shí)就主動(dòng)推送給瀏覽器。
瀏覽器請(qǐng)求
GET /webfin/websocket/ HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
服務(wù)器回應(yīng)
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
WebSocket借用http請(qǐng)求進(jìn)行握手,相比正常的http請(qǐng)求,多了一些內(nèi)容。其中,
Upgrade: websocket
Connection: Upgrade
表示希望將http協(xié)議升級(jí)到Websocket協(xié)議。
Sec-WebSocket-Key是瀏覽器隨機(jī)生成的base64 encode的值,用來(lái)詢問(wèn)服務(wù)器是否是支持WebSocket。
服務(wù)器返回
Upgrade: websocket
Connection: Upgrade
告訴瀏覽器即將升級(jí)的是Websocket協(xié)議
Sec-WebSocket-Accept是將請(qǐng)求包“Sec-WebSocket-Key”的值,與”258EAFA5-E914-47DA-95CA-C5AB0DC85B11″這個(gè)字符串進(jìn)行拼接,然后對(duì)拼接后的字符串進(jìn)行sha-1運(yùn)算,再進(jìn)行base64編碼得到的。用來(lái)說(shuō)明自己是WebSocket助理服務(wù)器。
Sec-WebSocket-Version是WebSocket協(xié)議版本號(hào)。RFC6455要求使用的版本是13,之前草案的版本均應(yīng)當(dāng)被棄用。
瀏覽器驗(yàn)證通過(guò)數(shù)據(jù)包內(nèi)容、格式,即成功建立websocket協(xié)議(狀態(tài)碼101)。
websocket必須瀏覽器要支持,服務(wù)器要支持,數(shù)據(jù)傳輸格式是Frame.
創(chuàng)建一個(gè)websocketnew Websocket("ws:localhost/chat")
Socketio:
介紹:Socket.IO是一個(gè)完全由JavaScript實(shí)現(xiàn)、基于Node.js、支持WebSocket的協(xié)議用于實(shí)時(shí)通信、跨平臺(tái)的開(kāi)源框架,它包括了客戶端的JavaScript和服務(wù)器端的Node.js。
使用場(chǎng)景:Socket.IO設(shè)計(jì)的目標(biāo)是構(gòu)建能夠在不同瀏覽器和移動(dòng)設(shè)備上良好運(yùn)行的實(shí)時(shí)應(yīng)用,如實(shí)時(shí)分析系統(tǒng)、二進(jìn)制流數(shù)據(jù)處理應(yīng)用、在線聊天室、在線客服系統(tǒng)、評(píng)論系統(tǒng)、WebIM等。
特點(diǎn):1.Socket.IO已經(jīng)具有眾多強(qiáng)大功能的模塊和擴(kuò)展API
2.Socket.IO實(shí)現(xiàn)了實(shí)時(shí)、雙向、基于事件的通訊機(jī)制,它解決了實(shí)時(shí)的通信問(wèn)題,并統(tǒng)一了服務(wù)端與客戶端的編程方式。啟動(dòng)了Socket以后,就像建立了一條客戶端與服務(wù)端的管道,兩邊可以互通有無(wú)。它還能夠和Express.js提供的傳統(tǒng)請(qǐng)求方式很好的結(jié)合,即可以在同一個(gè)域名,同一個(gè)端口提供兩種連接方式:
安裝socket.io:
搭建Socket.IO環(huán)境需要先創(chuàng)建一個(gè)作為工作空間的目錄,然后安裝Node.js,并在工作空間下安裝Socket.IO(命令:npm install socket.io),這樣環(huán)境已經(jīng)搭建完成。還可以安裝基于Node.js框架(如Express.js等)以協(xié)助應(yīng)用的服務(wù)器端開(kāi)發(fā)。
npm install socketio express --save-dev
socketio是對(duì)websocket協(xié)議封裝的一個(gè)模塊,讓客戶端和服務(wù)器端的寫(xiě)法都是一樣的
socket.emit()發(fā)數(shù)據(jù)
socket.on()收數(shù)據(jù)
常用方法:
監(jiān)聽(tīng)客戶端連接,回調(diào)函數(shù)會(huì)傳遞本次連接的socket
io.on('connection',function(socket));
給所有客戶端廣播消息
io.sockets.emit('String',data);
給指定的客戶端發(fā)送消息
io.sockets.socket(socketid).emit('String', data);
監(jiān)聽(tīng)客戶端發(fā)送的信息
socket.on('String',function(data));
給該socket的客戶端發(fā)送消息
socket.emit('String', data);