当前位置: 首页 > article >正文

websocket使用

概述

WebSocket 是一种适用于 Web 浏览器与服务器的全双工通信协议,支持网页实时收发数据,无需刷新页面或采用传统 HTTP 轮询机制,确保浏览器与服务器间连接稳定。该特性使其广泛应用于聊天应用、实时数据监控等领域,为实时交互提供高效解决方案。

Websocket 特点

  1. 实时性:WebSocket允许服务器主动向客户端推送数据,实现实时通信。
  2. 双向通信:WebSocket支持同时发送和接收数据,实现双向通信。
  3. 低延迟:由于建立了持久连接,并且数据传输没有额外的HTTP头部信息负担,因此WebSocket能够更快地传输小量数据。
  4. 数据传输:WebSocket可以传输文本和二进制数据。文本数据是以UTF-8编码发送和接收的,而二进制数据使用ArrayBuffer对象。
  5. 节省带宽:WebSocket只需要一个TCP握手就能创建一个到服务器的链接,并且这个链接可以被复用以节省带宽。
  6. 跨域通信:WebSocket协议支持跨域通信,因此可以在任何Web域之间建立实时连接,但仍然会受到服务器的安全策略限制。
  7. 可靠性:WebSocket提供了自动重连机制和数据压缩功能,增强了通信的可靠性。

基本使用

使用 WebSocket 进行连接和通信:

// 创建WebSocket对象
const ws= new WebSocket('ws://localhost:8080');

// 连接建立事件
ws.onopen = function() {
  console.log('连接成功建立');
  // 使用send()方法向服务器发送消息
  ws.send('连接成功建立');
};

// 接收到消息事件
ws.onmessage = function(res) {
  console.log('接收到后台服务返回的数据');
};

// 连接关闭事件
ws.onclose = function() {
  console.log('WebSocket连接已关闭');
};

//  连接错误事件
ws.onerror = function(error) {
  console.log('WebSocket连接错误', error);
};

在上述代码中,我们创建了一个WebSocket对象并设置了要连接的服务器地址。然后,我们为这个WebSocket对象添加了四个事件监听器:onopen(连接建立时触发)、onmessage(接收到消息时触发)、onclose(连接关闭时触发)和onerror (连接错误时触发)。

一旦WebSocket连接建立,我们就使 ws.send() 向服务器发送了一条消息“连接成功建立”。随后,每当服务器有新消息发送到客户端时,onmessage事件就会被激活,我们可以在这个事件的回调函数中处理接收到的消息内容。

当不再使用websocket链接服务时可以使用 ws.close() 方法手动关闭连接

WebSocket连接状态:要获取连接状态,可以使用 ws.readyState 属性

  • 0 —— “CONNECTING”:连接还未建立,
  • 1 —— “OPEN”:通信中,
  • 2 —— “CLOSING”:连接关闭中,
  • 3 —— “CLOSED”:连接已关闭。

使用实例

    使用express简单搭建一个websocket服务

  1. 初始化项目
    在项目目录中运行以下命令:

    npm init -y
    npm install express ws
    
  2. 创建 Express 和 WebSocket 服务
    创建一个 server.js 文件,编写代码:

    const express = require('express');
    const http = require('http');
    const WebSocket = require('ws');
    
    // 创建 Express 应用
    const app = express();
    
    // 创建一个 HTTP 服务器
    const server = http.createServer(app);
    
    // 创建 WebSocket 服务器,并将其绑定到 HTTP 服务器
    const wss = new WebSocket.Server({ server });
    
    // WebSocket 连接处理
    wss.on('connection', (ws) => {
      console.log('新的客户端连接');
    
      // 监听客户端发送的消息
      ws.on('message', (message) => {
        console.log(`收到消息: ${message}`);
    
        // 广播消息给所有客户端
        wss.clients.forEach((client) => {
          if (client !== ws && client.readyState === WebSocket.OPEN) {
            client.send(`服务器转发: ${message}`);
          }
        });
      });
    
      // 监听连接关闭
      ws.on('close', () => {
        console.log('客户端断开连接');
      });
    });
    
    // 提供静态文件服务(可选)
    app.use(express.static('public'));
    
    // 启动 HTTP 服务器
    const PORT = 3000;
    server.listen(PORT, () => {
      console.log(`服务器已启动,访问 http://localhost:${PORT}`);
    });
    
  3. 创建客户端测试页面
    在项目根目录下创建一个 public 文件夹,并在其中创建一个 index.html 文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>WebSocket 测试</title>
    </head>
    <body>
      <h1>WebSocket 测试</h1>
      <input type="text" id="messageInput" placeholder="输入消息">
      <button onclick="sendMessage()">发送</button>
      <ul id="messages"></ul>
    
      <script>
        // 创建 WebSocket 连接
        const ws = new WebSocket('ws://localhost:3000');
    
        // 监听连接打开
        ws.onopen = () => {
          console.log('已连接到服务器');
        };
    
        // 监听服务器发送的消息
        ws.onmessage = (event) => {
          const messages = document.getElementById('messages');
          const li = document.createElement('li');
          li.textContent = event.data;
          messages.appendChild(li);
        };
    
        // 监听连接关闭
        ws.onclose = () => {
          console.log('连接已关闭');
        };
    
        // 发送消息到服务器
        function sendMessage() {
          const input = document.getElementById('messageInput');
          const message = input.value;
          ws.send(message);
          input.value = '';
        }
      </script>
    </body>
    </html>
    
  4. 运行服务器
    在终端中运行以下命令启动服务器:

    node server.js
    

    启动成功后,打开html页面在输入框中输入内容,点击发送,从后台服务就可以看到成功发送的服务器上
    在这里插入图片描述

在这里插入图片描述


http://www.kler.cn/a/536526.html

相关文章:

  • Windows Docker笔记-简介摘录
  • 机器学习数学基础:14.矩阵的公式
  • TCP长连接、HTTP短轮询、HTTP长轮询、HTTP长连接、WebSocket的区别
  • 人人皆可创建自己的AI应用:DigitalOcean GenAI平台正式上线
  • 1-R语言概述
  • 通过多层混合MTL结构提升股票市场预测的准确性,R²最高为0.98
  • JAVA高级工程师-面试经历(含面试问题及解答)
  • k8s节点维护注意事项
  • CVE-2024-13025-Codezips 大学管理系统 faculty.php sql 注入分析及拓展
  • 中国城商行信贷业务数仓建设白皮书(第四期:机器学习中台建设)
  • 多光谱成像技术在华为Mate70系列的应用
  • 蓝耘智算平台搭载DeepSeek R1模型:高效环境配置全攻略
  • 把DeepSeek接入Word软件,给工作提质增效!
  • 《XSS跨站脚本攻击》
  • ChatGPT提问技巧:行业热门应用提示词案例-文案写作
  • 【R】Dijkstra算法求最短路径
  • 记录 | WPF基础学习Style局部和全局调用
  • ubuntu和手机之间如何传递消息
  • Spider 数据集上实现nlp2sql训练任务
  • SpringCloud面试题----SpringCloud和Dubbo有什么区别
  • Synchronized和ReentrantLock面试详解
  • 第4章 Jetpack Compose提供了一系列的布局组件
  • 【Elasticsearch】分桶聚合功能概述
  • Windows上工程组织方式 --- dll插件式
  • 本地缓存怎么保证数据一致性?
  • pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题