為什么要用socket.io進行通信
Browser和WebServer間的實時數據傳輸是一個很重要的需求致开,但最早只能通過AJAX輪詢方式實現
幾種長連接的通信方式
輪詢:客戶端定時向服務器發(fā)送Ajax請求甲雅,服務器接到請求后馬上返回響應信息并關閉連接解孙。
優(yōu)點:后端程序編寫比較容易。
缺點:請求中有大半是無用抛人,浪費帶寬和服務器資源弛姜。(而每一次的 HTTP 請求和應答都帶有完整的 HTTP 頭信息,這就增加了每次傳輸的數據量)
實例:適于小型應用妖枚。
長輪詢:客戶端向服務器發(fā)送Ajax請求廷臼,服務器接到請求后hold住連接,直到有新消息才返回響應信息并關閉連接(或到了設定的超時時間關閉連接)绝页,客戶端處理完響應信息后再向服務器發(fā)送新的請求荠商。
優(yōu)點:在無消息的情況下不會頻繁的請求,節(jié)省了網絡流量续誉,解決了服務端一直疲于接受請求的窘境
缺點:服務器hold連接會消耗資源莱没,需要同時維護多個線程,服務器所能承載的TCP連接數是有上限的,這種輪詢很容易把連接數頂滿。
實例:WebQQ背苦、Hi網頁版禀忆、Facebook IM。
長連接:在頁面里嵌入一個隱蔵iframe芙代,將這個隱蔵iframe的src屬性設為對一個長連接的請求,服務器端就能源源不斷地往客戶端輸入數據。
優(yōu)點:消息即時到達寄狼,不發(fā)無用請求。
缺點:服務器維護一個長連接會增加開銷氨淌。
實例:Gmail聊天
Flash Socket:在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript通過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通信例嘱,JavaScript在收到服務器端傳送的信息后控制頁面的顯示。
優(yōu)點:實現真正的即時通信宁舰,而不是偽即時拼卵。
缺點:客戶端必須安裝Flash插件;非HTTP協(xié)議蛮艰,無法自動穿越防火墻腋腮。
實例:網絡互動游戲。
WebSocket:
WebSocket 協(xié)議本質上是一個基于 TCP 的協(xié)議。為了建立一個 WebSocket 連接即寡,客戶端瀏覽器首先要向服務器發(fā)起一個 HTTP 請求徊哑,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息聪富,其中附加頭信息”Upgrade: WebSocket”表 明這是一個申請協(xié)議升級的 HTTP 請求莺丑,服務器端解析這些附加的頭信息然后產生應答信息返回給客戶端,客戶端和服務器端的 WebSocket 連接就建立起來了墩蔓,雙方就可以通過這個連接通道自由的傳遞信息梢莽,并且這個連接會持續(xù)存在直到客戶端或者服務器端的某一方主動的關閉連接。
socket.io的使用(socket.io使用三部曲)
1奸披,通過io來實現server與client的連接
const socket = io('服務器地址', {
query: `username=參數`
});
2昏名,通過emit發(fā)送消息
socketclient.emit("student", {"roomID":clientRoomID,"textMessage": "hello"});
3,通過on來監(jiān)聽emit事件
socket.on( 'server',(data)=>{
console.log(data,"通過監(jiān)聽server/course/start字段得到的數據")
}
關于參數:第一個參數是前后端 約定好的長連接地址或發(fā)送接受事件的字段,第二個參數是 將要發(fā)送或接收的數據