html5 websocket技術實現及應用案例

一、websocket基礎知識

WebSocket是一種網路通信協議,在客戶端和伺服器之間建立全雙工通信通道,可以實現實時通信的目的,是HTML5中新增的標準,可以在瀏覽器和伺服器之間建立持久性的連接。

WebSocket協議建立在TCP協議之上,客戶端的瀏覽器首先向伺服器發出一個HTTP請求,然後在伺服器端生成一個WebSocket對象,再根據請求頭中的「Upgrade」欄位判斷客戶端是否要升級協議,如果是的話就發送一個「101 Switching Protocols」的響應頭,表明已經同意進行協議升級,從而建立WebSocket連接。這意味著WebSocket協議可以同時在HTTP和TCP協議之上運行。

二、websocket實現和應用案例

1、websocket實現


const socket = new WebSocket('ws://localhost:8080/ws');

socket.onopen = () => {
  console.log('WebSocket連接已打開');
};

socket.onmessage = event => {
  console.log(`收到消息:${event.data}`);
};

socket.onclose = event => {
  console.log(`WebSocket連接已關閉,關閉碼為:${event.code}`);
};

socket.onerror = error => {
  console.error(`WebSocket連接發生錯誤:${error}`);
};

2、應用案例1 – 實現實時聊天室

通過WebSocket實現實時聊天室,代碼如下:


const socket = new WebSocket('ws://localhost:8080/ws');
const form = document.getElementById('form');
const message = document.getElementById('message');

socket.addEventListener('message', event => {
  const li = document.createElement('li');
  li.innerText = event.data;
  document.getElementById('messages').appendChild(li);
});

form.addEventListener('submit', event => {
  event.preventDefault();
  const text = message.value;
  socket.send(text);
  message.value = '';
});

3、應用案例2 – 實現基於WebSocket的協作白板

通過WebSocket實現基於協作的白板,可以多人實時協作塗鴉和繪圖,代碼如下:


const socket = new WebSocket('ws://localhost:8080/ws');
const canvas = document.getElementById('canvas');
const context = canvas.getContext('2d');
let isDrawing = false;

canvas.addEventListener('mousedown', event => {
  isDrawing = true;
});

canvas.addEventListener('mousemove', event => {
  if (isDrawing) {
    const x = event.clientX - canvas.offsetLeft;
    const y = event.clientY - canvas.offsetTop;
    context.lineTo(x, y);
    context.stroke();
    socket.send(JSON.stringify({ x, y }));
  }
});

canvas.addEventListener('mouseup', event => {
  isDrawing = false;
});

socket.addEventListener('message', event => {
  const data = JSON.parse(event.data);
  context.lineTo(data.x, data.y);
  context.stroke();
});

三、WebSocket與其他技術的結合

WebSocket可以與其他技術結合起來使用,例如:

1、與Node.js結合,使用ws庫實現WebSocket伺服器端:


const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });

server.on('connection', socket => {
  console.log('WebSocket連接已打開');

  socket.on('message', message => {
    console.log(`收到消息:${message}`);
    server.clients.forEach(client => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message);
      }
    });
  });

  socket.on('close', () => {
    console.log('WebSocket連接已關閉');
  });

  socket.on('error', error => {
    console.error(`WebSocket連接發生錯誤:${error}`);
  });
});

2、與GraphQL結合,使用subscriptions-transport-ws庫實現GraphQL實時訂閱。GraphQL是一種客戶端和伺服器之間數據通信的協議,可以使用subscriptions-transport-ws庫在WebSocket上實現實時訂閱:


const { SubscriptionServer } = require('subscriptions-transport-ws');
const { execute, subscribe } = require('graphql');
const { createServer } = require('http');
const { SubscriptionType } = require('./schema');

const schema = new GraphQLSchema({
  subscription: SubscriptionType,
});

const server = createServer((request, response) => {
  response.writeHead(404);
  response.end();
});

server.listen(8080, () => {
  console.log('GraphQL WebSocket服務已啟動');
});

const subscriptionServer = SubscriptionServer.create({
  schema,
  execute,
  subscribe,
}, {
  server,
  path: '/graphql',
});

四、WebSocket的優缺點

1、優點:

① 實現了實時通信,可以在客戶端和服務端之間建立持久性的連接;

② 支持用於多種用例,例如實時聊天、協作塗鴉、實時遊戲等;

③ 並發性高,可以在同一時間處理多個連接;

④ 跨平台兼容性好,可以在不同的操作系統和瀏覽器中使用。

2、缺點:

① WebSocket協議較為新穎,需要一定的學習和使用成本;

② 由於WebSocket是在HTTP協議之上實現的,因此無法直接與已有的TCP/IP協議的應用程序集成;

③ 由於WebSocket協議需要伺服器端主動向客戶端推送信息,因此需要較高的伺服器性能。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/257761.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:46
下一篇 2024-12-15 12:46

相關推薦

  • Python數據統計案例的實現

    Python作為一個高級編程語言,擁有著豐富的數據處理庫和工具,能夠快速、高效地進行各類數據處理和分析。本文將結合實例,從多個方面詳細闡述Python數據統計的實現。 一、數據讀取…

    編程 2025-04-29
  • Python熱重載技術

    Python熱重載技術是現代編程的關鍵功能之一。它可以幫助我們在程序運行的過程中,更新代碼而無需重新啟動程序。本文將會全方位地介紹Python熱重載的實現方法和應用場景。 一、實現…

    編程 2025-04-29
  • Python包絡平滑技術解析

    本文將從以下幾個方面對Python包絡平滑技術進行詳細的闡述,包括: 什麼是包絡平滑技術? Python中使用包絡平滑技術的方法有哪些? 包絡平滑技術在具體應用中的實際效果 一、包…

    編程 2025-04-29
  • 微信小程序重構H5技術方案設計 Github

    本文旨在探討如何在微信小程序中重構H5技術方案,以及如何結合Github進行代碼存儲和版本管理。我們將從以下幾個方面進行討論: 一、小程序與H5技術對比 微信小程序與H5技術都可以…

    編程 2025-04-28
  • parent.$.dialog是什麼技術的語法

    parent.$.dialog是一種基於jQuery插件的彈出式對話框技術,它提供了一個方便快捷的方式來創建各種類型和樣式的彈出式對話框。它是對於在網站開發中常見的彈窗、提示框等交…

    編程 2025-04-28
  • HTML sprite技術

    本文將從多個方面闡述HTML sprite技術,包含基本概念、使用示例、實現原理等。 一、基本概念 1、什麼是HTML sprite? HTML sprite,也稱CSS spri…

    編程 2025-04-28
  • Python工作需要掌握什麼技術

    Python是一種高級編程語言,它因其簡單易學、高效可靠、可擴展性強而成為最流行的編程語言之一。在Python開發中,需要掌握許多技術才能讓開發工作更加高效、準確。本文將從多個方面…

    編程 2025-04-28
  • yarn npm 倉庫用法介紹及使用案例

    本文將從多個方面對yarn npm倉庫進行詳細闡述,並為你提供一些實際使用案例。 一、npm和yarn的比較 npm和yarn都是JavaScript的包管理工具。npm在Java…

    編程 2025-04-27
  • 開源腦電波技術

    本文將會探討開源腦電波技術的應用、原理和示例。 一、腦電波簡介 腦電波(Electroencephalogram,簡稱EEG),是一種用於檢測人腦電活動的無創性技術。它通過在頭皮上…

    編程 2025-04-27
  • 阿里Python技術手冊

    本文將從多個方面對阿里Python技術手冊進行詳細闡述,包括規範、大數據、Web應用、安全和調試等方面。 一、規範 Python的編寫規範對於代碼的可讀性和可維護性有很大的影響。阿…

    編程 2025-04-27

發表回復

登錄後才能評論