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/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

发表回复

登录后才能评论