websocket實(shí)現(xiàn)

websocket是什么

websocket相比于Http而言是一個(gè)雙向通信的協(xié)議赌厅,并且一直保持活動(dòng)狀態(tài)穷绵,直到客戶端或者服務(wù)端斷開。

主要用于監(jiān)聽特愿、消息仲墨、通知等需要實(shí)時(shí)反饋消息的場(chǎng)景勾缭。

如:聊天場(chǎng)景、下載進(jìn)度目养、發(fā)布系統(tǒng)日志反饋等俩由。

當(dāng)然也可以通過Http輪詢來(lái)實(shí)現(xiàn)以上場(chǎng)景,不過websocket相較http更輕更快癌蚁。
采用http輪詢需要反復(fù)的鏈接幻梯、斷開連接更加消耗瀏覽器資源。

image.png
  • HTTP 是無(wú)狀態(tài)的努释,也就是說碘梢,它將每個(gè)請(qǐng)求當(dāng)成唯一和獨(dú)立的。無(wú)狀態(tài)協(xié)議具有一些優(yōu)勢(shì)伐蒂,例如煞躬,服務(wù)器不需要保存有關(guān)會(huì)話的信息,從而不需要存儲(chǔ)數(shù)據(jù)饿自。但是汰翠,這也意味著在每次 HTTP 請(qǐng)求和響應(yīng)中都會(huì)發(fā)送關(guān)于請(qǐng)求的冗余信息,比如使用 Cookie 進(jìn)行用戶狀態(tài)的驗(yàn)證昭雌。

websocket特點(diǎn)

(1)建立在 TCP 協(xié)議之上复唤,服務(wù)器端的實(shí)現(xiàn)比較容易。

(2)與 HTTP 協(xié)議有著良好的兼容性烛卧。默認(rèn)端口也是 80 和 443佛纫,并且握手階段采用 HTTP 協(xié)議,因此握手時(shí)不容易屏蔽总放,能通過各種 HTTP 代理服務(wù)器呈宇。

(3)數(shù)據(jù)格式比較輕量,性能開銷小局雄,通信高效甥啄。

(4)可以發(fā)送文本,也可以發(fā)送二進(jìn)制數(shù)據(jù)炬搭。

(5)沒有同源限制蜈漓,客戶端可以與任意服務(wù)器通信。

(6)借助了http協(xié)議的一次握手建立連接宫盔。

前端實(shí)現(xiàn)

const pre = "wss:"  // 或"ws:"
// 拼接url
const surl = `${pre}${url}`

// 校驗(yàn)瀏覽器是否支持websocket
if (typeof WebSocket === "undefined") {
  return
}
const websocket = new WebSocket(surl)
    // console.log(websocket.readyState) // 0 
    // readyState 
    // 0 鏈接還沒有建立(正在建立鏈接)
    // 1 鏈接建立成
    // 2 鏈接正在關(guān)閉
    // 3 鏈接已經(jīng)關(guān)閉

// 如果鏈接成功建立融虽,向服務(wù)器發(fā)送消息
if(websocket.readyState === 1){
  sendMessage(data)
// 否則一秒后重新嘗試(此步需要遞歸,這里只展示思路)
} else if (websocket.readyState === 0) {
  setTimeOut(() => {
  if(websocket.readyState === 1){
   sendMessage(data)
}
}, 1000)
}

if(websocket.readyState === 3){
  console.log("鏈接異常灼芭,請(qǐng)稍后重試")
  // 進(jìn)入錯(cuò)誤處理
  onError()
}



const sendWebsocket = ({
  url,
  params = {},
  onMessage,
  onError,
}) => {

// 監(jiān)聽鏈接開啟
websocket.onopen = () => {
  console.log("--open--")
}

// 監(jiān)聽消息
websocket.onmessage= (e) => {
    console.log(e)
  // do something
onMessage();
}

// 監(jiān)聽錯(cuò)誤
websocket.onerror= (e) => {
    console.log(e)
  // do something
onError()
}

// 監(jiān)聽關(guān)閉狀態(tài)
websocket.onerror= (e) => {
    console.log(e)
  // do something
}

}

// 向服務(wù)端發(fā)送數(shù)據(jù)
const sendMessage = (data) => {
  websocket.send(JSON.stringify(data))
}

// 請(qǐng)求關(guān)閉連接
const closeWebsocket = () => {
  websocket.close()
}

websocket在前端一共有四種監(jiān)聽回調(diào): onopen有额、onmessage、onerror、onclose, 也就是開啟巍佑、有服務(wù)端發(fā)來(lái)消息茴迁、有錯(cuò)誤發(fā)生、關(guān)閉

websocket需要先建立連接句狼,再手動(dòng)調(diào)用.send方法向服務(wù)端發(fā)送數(shù)據(jù)笋熬。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腻菇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昔馋,老刑警劉巖筹吐,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秘遏,居然都是意外死亡丘薛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門邦危,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洋侨,“玉大人,你說我怎么就攤上這事倦蚪∠<幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵陵且,是天一觀的道長(zhǎng)裁僧。 經(jīng)常有香客問我,道長(zhǎng)慕购,這世上最難降的妖魔是什么聊疲? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮沪悲,結(jié)果婚禮上获洲,老公的妹妹穿的比我還像新娘。我一直安慰自己殿如,他們只是感情好贡珊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著握截,像睡著了一般飞崖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谨胞,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天固歪,我揣著相機(jī)與錄音,去河邊找鬼。 笑死牢裳,一個(gè)胖子當(dāng)著我的面吹牛逢防,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲讯,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼忘朝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了判帮?” 一聲冷哼從身側(cè)響起局嘁,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晦墙,沒想到半個(gè)月后悦昵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晌畅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年但指,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抗楔。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棋凳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出连躏,到底是詐尸還是另有隱情剩岳,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布反粥,位于F島的核電站卢肃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏才顿。R本人自食惡果不足惜莫湘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望郑气。 院中可真熱鬧幅垮,春花似錦、人聲如沸尾组。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讳侨。三九已至呵萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨跨,已是汗流浹背潮峦。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工囱皿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忱嘹。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓嘱腥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拘悦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子齿兔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容