初識(shí)websocket

from_researchgate.png

WebSocket是什么

WebSocket是一種在Web應(yīng)用程序中實(shí)現(xiàn)實(shí)時(shí)雙向通信的協(xié)議,它允許服務(wù)器主動(dòng)向客戶端推送數(shù)據(jù)果覆,并且客戶端也可以向服務(wù)器發(fā)送數(shù)據(jù),實(shí)現(xiàn)了真正的雙向通信。與傳統(tǒng)的HTTP請(qǐng)求相比垒迂,WebSocket減少了通信的開(kāi)銷,節(jié)省了帶寬妒蛇,并且能夠?qū)崟r(shí)傳輸數(shù)據(jù)机断,無(wú)需客戶端頻繁地發(fā)起請(qǐng)求。

WebSocket的工作原理

WebSocket協(xié)議基于TCP連接绣夺,與HTTP協(xié)議不同的是吏奸,WebSocket在建立連接后會(huì)保持持久連接,通過(guò)握手協(xié)議和幀的形式進(jìn)行數(shù)據(jù)傳輸陶耍。以下是WebSocket的基本工作流程:

  1. 客戶端發(fā)起WebSocket連接請(qǐng)求奋蔚,請(qǐng)求頭中包含Upgrade字段,值為"websocket",以及其他必要的參數(shù)泊碑。以下展示了如何使用Node.js處理WebSocket握手請(qǐng)求:
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.headers.upgrade && req.headers.upgrade.toLowerCase() === 'websocket') {
    // 處理WebSocket握手
    // ...
    // 這里可以編寫進(jìn)一步處理WebSocket握手的代碼
  } else {
    // 處理其他HTTP請(qǐng)求
    res.statusCode = 404;
    res.end();
  }
});

server.listen(8080, () => {
  console.log('HTTP服務(wù)器已啟動(dòng)');
});
  1. 服務(wù)器響應(yīng)連接請(qǐng)求坤按,返回101狀態(tài)碼和Upgrade字段,表示成功切換到WebSocket協(xié)議馒过。以下展示了如何使用Node.js響應(yīng)WebSocket連接請(qǐng)求:
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.headers.upgrade && req.headers.upgrade.toLowerCase() === 'websocket') {
    // 處理WebSocket握手
    res.writeHead(101, {
      'Upgrade': 'websocket',
      'Connection': 'Upgrade',
      // 這里可以添加其他必要的響應(yīng)頭部
    });
    res.end();

    // 在此之后臭脓,可以繼續(xù)處理WebSocket連接
    // ...
  } else {
    // 處理其他HTTP請(qǐng)求
    res.statusCode = 404;
    res.end();
  }
});

server.listen(8080, () => {
  console.log('HTTP服務(wù)器已啟動(dòng)');
});
  1. 建立WebSocket連接后,客戶端和服務(wù)器可以通過(guò)發(fā)送幀來(lái)進(jìn)行實(shí)時(shí)通信腹忽。幀由標(biāo)識(shí)符来累、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)組成,可以是文本或二進(jìn)制數(shù)據(jù)窘奏。

  2. 雙方可以隨時(shí)發(fā)送幀佃扼,服務(wù)器可以主動(dòng)向客戶端推送數(shù)據(jù),客戶端也可以向服務(wù)器發(fā)送數(shù)據(jù)蔼夜。

  3. 當(dāng)通信結(jié)束或需要關(guān)閉連接時(shí)兼耀,可以發(fā)送特定的幀進(jìn)行關(guān)閉握手,雙方完成關(guān)閉操作后斷開(kāi)連接求冷。

前端如何使用

如何在JavaScript中使用WebSocket與服務(wù)器進(jìn)行實(shí)時(shí)通信瘤运。

// 創(chuàng)建WebSocket連接
var socket = new WebSocket('ws://example.com/socket');

// 連接成功時(shí)的回調(diào)函數(shù)
socket.onopen = function () {
  console.log('WebSocket連接已建立');
  
  // 向服務(wù)器發(fā)送數(shù)據(jù)
  socket.send('Hello, Server!');
};

// 接收到服務(wù)器發(fā)送的數(shù)據(jù)時(shí)的回調(diào)函數(shù)
socket.onmessage = function (event) {
  console.log('收到服務(wù)器的消息:', event.data);
};

// 連接關(guān)閉時(shí)的回調(diào)函數(shù)
socket.onclose = function () {
  console.log('WebSocket連接已關(guān)閉');
};

// 發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù)
socket.onerror = function (error) {
  console.error('WebSocket發(fā)生錯(cuò)誤:', error);
};

在上述示例中,我們首先創(chuàng)建了一個(gè)WebSocket對(duì)象匠题,將服務(wù)器的WebSocket地址作為參數(shù)傳遞給構(gòu)造函數(shù)拯坟。然后,我們定義了幾個(gè)回調(diào)函數(shù)韭山,分別處理連接建立郁季、接收消息、連接關(guān)閉和錯(cuò)誤等事件钱磅。在連接建立后梦裂,我們可以使用socket.send方法向服務(wù)器發(fā)送數(shù)據(jù),服務(wù)器發(fā)送的消息將通過(guò)socket.onmessage回調(diào)函數(shù)接收盖淡。

后端如何響應(yīng)

如何使用node.js在后端監(jiān)聽(tīng)和處理WebSocket連接年柠。

const WebSocket = require('ws');

// 創(chuàng)建WebSocket服務(wù)器
const wss = new WebSocket.Server({ port: 8080 });

// 監(jiān)聽(tīng)WebSocket連接事件
wss.on('connection', function (ws) {
  console.log('WebSocket連接已建立');

  // 監(jiān)聽(tīng)消息接收事件
  ws.on('message', function (message) {
    console.log('收到客戶端的消息:', message);

    // 向客戶端發(fā)送消息
    ws.send('Hello, Client!');
  });

  // 監(jiān)聽(tīng)連接關(guān)閉事件
  ws.on('close', function () {
    console.log('WebSocket連接已關(guān)閉');
  });

  // 發(fā)生錯(cuò)誤時(shí)的處理
  ws.on('error', function (error) {
    console.error('WebSocket發(fā)生錯(cuò)誤:', error);
  });
});

寫在最后

通過(guò)WebSocket,服務(wù)器可以主動(dòng)向客戶端推送數(shù)據(jù)褪迟,而無(wú)需客戶端頻繁地發(fā)起請(qǐng)求冗恨。本文入門級(jí)地介紹了WebSocket的基本概念和工作原理,在實(shí)際應(yīng)用中味赃,建議使用成熟的WebSocket庫(kù)掀抹,如Socket.io或Werkzeug等,以簡(jiǎn)化開(kāi)發(fā)過(guò)程并提供更多功能心俗。保持學(xué)習(xí)傲武,共勉~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谱轨,更是在濱河造成了極大的恐慌,老刑警劉巖吠谢,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件土童,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡工坊,警方通過(guò)查閱死者的電腦和手機(jī)献汗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)王污,“玉大人罢吃,你說(shuō)我怎么就攤上這事≌哑耄” “怎么了尿招?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)阱驾。 經(jīng)常有香客問(wèn)我就谜,道長(zhǎng),這世上最難降的妖魔是什么里覆? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任丧荐,我火速辦了婚禮,結(jié)果婚禮上喧枷,老公的妹妹穿的比我還像新娘虹统。我一直安慰自己,他們只是感情好隧甚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布车荔。 她就那樣靜靜地躺著,像睡著了一般戚扳。 火紅的嫁衣襯著肌膚如雪夸赫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天咖城,我揣著相機(jī)與錄音茬腿,去河邊找鬼。 笑死宜雀,一個(gè)胖子當(dāng)著我的面吹牛切平,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辐董,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悴品,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起苔严,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤定枷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后届氢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欠窒,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年退子,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岖妄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寂祥,死狀恐怖荐虐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丸凭,我是刑警寧澤福扬,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站惜犀,受9級(jí)特大地震影響忧换,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜向拆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一亚茬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧浓恳,春花似錦刹缝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晴圾,卻和暖如春颂砸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背死姚。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工人乓, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人都毒。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓色罚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親账劲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戳护,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 什么是WebSocket WebSocket 是一種在單個(gè)TCP連接上進(jìn)行全雙工通訊的協(xié)議金抡,屬于應(yīng)用層協(xié)議。它基于...
    九又四分之三o閱讀 469評(píng)論 0 2
  • 一腌且、定義 WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議梗肝。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工(full-duple...
    寧好_8848閱讀 593評(píng)論 0 0
  • 前言:工作中在驗(yàn)證前端頁(yè)面展示數(shù)據(jù)時(shí),接觸到websocket這一概念铺董,這里粗略記錄下關(guān)于websocket的理解...
    在你的世界路過(guò)閱讀 1,021評(píng)論 3 4
  • 版權(quán)聲明:本文為作者原創(chuàng)書籍巫击。轉(zhuǎn)載請(qǐng)注明作者和出處,未經(jīng)授權(quán)柄粹,嚴(yán)禁私自轉(zhuǎn)載喘鸟,侵權(quán)必究4倚濉Wび摇! 情感語(yǔ)錄: 人生的游戲...
    一巴掌拍出兩坨脂肪閱讀 3,414評(píng)論 0 2
  • 關(guān)于webSocket的話題并不少見(jiàn)崎淳,比如我們經(jīng)常遇到的聊天室啦堪夭,實(shí)時(shí)的消息互動(dòng)啦,巴拉巴拉很多東西都會(huì)使用的一項(xiàng)...
    九眼橋吳彥祖閱讀 471評(píng)論 0 2