WebSocket 原理与机制

websocket深入浅出 websocket简介 websocket是什么 答: 它是一种网络通信协议,是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 为什么需要websocket? 疑问? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答: 因为 HTTP 协议有一个缺陷:通信只能由客户端发起 我们都知道轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP... 阅读详情
AI摘要

本文介绍了WebSocket,它是HTML5全双工通信协议,能解决HTTP局限性,实现持久化双向通信。阐述了其核心原理、通信机制,包括握手过程、数据帧格式、心跳与重连机制。还给出基于Node.js和HTML+JavaScript的完整应用样例,说明了运行和核心功能,确保连接稳定实时。

1. 核心原理

WebSocket 是 HTML5 定义的全双工通信协议,旨在解决 HTTP 协议的局限性(单向请求 - 响应、短连接),实现客户端与服务器的持久化双向通信。其核心特点包括:

  • 持久连接:通过一次 HTTP 握手建立连接后,保持 TCP 连接不关闭,避免频繁建立连接的开销。
  • 全双工通信:连接建立后,客户端和服务器可随时向对方发送数据,无需等待对方响应。
  • 轻量协议:数据帧格式简洁,比 HTTP 头部开销更小,适合实时场景(如聊天、实时数据监控、游戏等)。
2. 通信机制
(1)握手过程(基于 HTTP/HTTPS)

WebSocket 连接通过 HTTP 协议发起,本质是「协议升级」过程:

  1. 客户端发送 HTTP GET 请求,携带特殊头部表示要升级到 WebSocket 协议
  2. GET /ws HTTP/1.1
    Host: example.com
    Upgrade: websocket  # 声明要升级的协议
    Connection: Upgrade  # 声明连接要升级
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==  # 随机字符串,用于验证
    Sec-WebSocket-Version: 13  # 协议版本
  3. 服务器验证请求后,返回 101 Switching Protocols 响应,确认协议升级:
  4. 握手成功后,通信切换到 WebSocket 协议,使用 TCP 连接直接传输数据。
(2)数据帧格式

WebSocket 数据通过「帧」传输,帧结构包含:

  • FIN:1 位,标识是否为消息的最后一帧。
  • Opcode:4 位,标识帧类型(如文本帧 0x1、二进制帧 0x2、ping 帧 0x9、pong 帧 0xA、关闭帧 0x8)。
  • Mask:1 位,客户端发送的帧必须设置为 1(带掩码),服务器发送的帧为 0。
  • Payload Data:实际传输的数据(文本或二进制)。
(3)心跳与重连机制
  • 心跳(Heartbeat):用于检测连接是否存活。客户端定期发送「ping」帧(或自定义心跳消息),服务器收到后返回「pong」帧。若超时未收到 pong,判定连接断开。
  • 重连(Reconnection):连接断开后,客户端自动尝试重新连接,通常采用「指数退避」策略(重试间隔逐渐增加,如 1s→2s→4s...),避免频繁重试消耗资源。

完整应用样例(含心跳与重连)

以下实现一个基于 Node.js(服务器)和浏览器(客户端)的 WebSocket 应用,包含消息收发、心跳检测和自动重连功能。

1. 服务器端(Node.js + ws 库)

使用 ws 库(WebSocket 服务器实现),处理连接、消息、心跳和断开事件。

// 安装依赖:npm install ws
const WebSocket = require('ws');

// 创建WebSocket服务器,监听8080端口
const wss = new WebSocket.Server({ port: 8080 });

console.log('WebSocket服务器启动,监听端口8080');

// 监听客户端连接
wss.on('connection', (ws) => {
  console.log('新客户端连接');

  // 处理客户端发送的消息
  ws.on('message', (data) => {
    const message = JSON.parse(data.toString());
    console.log('收到消息:', message);

    // 若为心跳消息,回复确认
    if (message.type === 'heartbeat') {
      ws.send(JSON.stringify({
        type: 'heartbeat',
        timestamp: Date.now(),
        message: 'pong'
      }));
    } else {
      // 普通消息,广播给所有客户端
      wss.clients.forEach((client) => {
        if (client.readyState === WebSocket.OPEN) {
          client.send(JSON.stringify({
            type: 'message',
            content: message.content,
            time: new Date().toLocaleTimeString()
          }));
        }
      });
    }
  });

  // 处理连接关闭
  ws.on('close', () => {
    console.log('客户端断开连接');
  });

  // 处理错误
  ws.on('error', (err) => {
    console.error('连接错误:', err);
  });
});
2. 客户端(HTML + JavaScript)

实现连接管理、消息收发、心跳检测(定时发送心跳)和自动重连(指数退避策略)。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>WebSocket 客户端</title>
  <script src="https://cdn.tailwindcss.com"></script>
  <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
  <style>
    .message-list {
      height: 400px;
      overflow-y: auto;
    }
  </style>
</head>
<body class="bg-gray-100 p-4">
  <div class="max-w-2xl mx-auto bg-white rounded-lg shadow-md p-6">
    <h1 class="text-2xl font-bold mb-4 flex items-center">
      <i class="fa fa-comments text-blue-500 mr-2"></i>WebSocket 实时通信
    </h1>
    
    <!-- 连接状态 -->
    <div id="status" class="mb-4 p-2 bg-yellow-100 text-yellow-800 rounded">
      <i class="fa fa-circle-o-notch fa-spin mr-2"></i>正在连接...
    </div>

    <!-- 消息列表 -->
    <div class="message-list border border-gray-200 rounded-lg p-3 mb-4 bg-gray-50">
      <div id="messages" class="space-y-2"></div>
    </div>

    <!-- 发送消息区域 -->
    <div class="flex gap-2">
      <input 
        type="text" 
        id="messageInput" 
        placeholder="输入消息..." 
        class="flex-1 px-3 py-2 border border-gray-300 rounded focus:outline-none focus:ring-2 focus:ring-blue-500"
      >
      <button 
        id="sendBtn" 
        class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 disabled:bg-gray-400"
        disabled
      >
        <i class="fa fa-paper-plane mr-1"></i>发送
      </button>
    </div>
  </div>

  <script>
    // 客户端配置
    const WS_URL = 'ws://localhost:8080';
    const HEARTBEAT_INTERVAL = 30000; // 心跳间隔(30秒)
    const RECONNECT_DELAY_BASE = 1000; // 初始重连延迟(1秒)
    const MAX_RECONNECT_DELAY = 10000; // 最大重连延迟(10秒)

    // 状态变量
    let ws; // WebSocket实例
    let heartbeatTimer; // 心跳定时器
    let lastHeartbeatTime = 0; // 最后一次收到心跳响应的时间
    let reconnectDelay = RECONNECT_DELAY_BASE; // 当前重连延迟
    let isConnecting = false; // 是否正在连接中

    // DOM元素
    const statusEl = document.getElementById('status');
    const messagesEl = document.getElementById('messages');
    const messageInput = document.getElementById('messageInput');
    const sendBtn = document.getElementById('sendBtn');

    // 初始化连接
    connect();

    // 连接WebSocket服务器
    function connect() {
      if (isConnecting) return;
      isConnecting = true;
      updateStatus('正在连接...', 'yellow');

      // 创建WebSocket实例
      ws = new WebSocket(WS_URL);

      // 连接成功
      ws.onopen = () => {
        console.log('连接成功');
        isConnecting = false;
        reconnectDelay = RECONNECT_DELAY_BASE; // 重置重连延迟
        updateStatus('已连接', 'green');
        sendBtn.disabled = false;

        // 启动心跳检测
        startHeartbeat();
      };

      // 收到消息
      ws.onmessage = (event) => {
        const message = JSON.parse(event.data);
        handleMessage(message);
      };

      // 连接关闭
      ws.onclose = (event) => {
        console.log('连接关闭,代码:', event.code, '原因:', event.reason);
        isConnecting = false;
        sendBtn.disabled = true;
        stopHeartbeat();

        // 异常关闭才重连(正常关闭代码1000)
        if (event.code !== 1000) {
          updateStatus(`连接断开,${reconnectDelay/1000}秒后重试...`, 'red');
          setTimeout(connect, reconnectDelay);
          // 重连延迟指数增加(但不超过最大值)
          reconnectDelay = Math.min(reconnectDelay * 2, MAX_RECONNECT_DELAY);
        } else {
          updateStatus('连接已关闭', 'gray');
        }
      };

      // 连接错误
      ws.onerror = (error) => {
        console.error('连接错误:', error);
        updateStatus('连接错误', 'red');
      };
    }

    // 处理收到的消息
    function handleMessage(message) {
      if (message.type === 'heartbeat') {
        // 收到心跳响应,更新时间
        lastHeartbeatTime = Date.now();
        console.log('收到心跳响应:', message);
      } else if (message.type === 'message') {
        // 显示普通消息
        const messageEl = document.createElement('div');
        messageEl.className = 'p-2 bg-blue-50 rounded border-l-4 border-blue-500';
        messageEl.innerHTML = `
          <div class="text-sm text-gray-500">${message.time}</div>
          <div class="mt-1">${message.content}</div>
        `;
        messagesEl.appendChild(messageEl);
        // 滚动到底部
        messagesEl.scrollTop = messagesEl.scrollHeight;
      }
    }

    // 发送消息
    function sendMessage() {
      const content = messageInput.value.trim();
      if (!content || !ws || ws.readyState !== WebSocket.OPEN) return;

      ws.send(JSON.stringify({
        type: 'message',
        content: content
      }));
      messageInput.value = '';
    }

    // 启动心跳检测
    function startHeartbeat() {
      // 定时发送心跳
      heartbeatTimer = setInterval(() => {
        if (ws && ws.readyState === WebSocket.OPEN) {
          // 发送心跳消息
          ws.send(JSON.stringify({
            type: 'heartbeat',
            timestamp: Date.now()
          }));
          console.log('发送心跳');

          // 检查是否超时(10秒内未收到响应)
          const now = Date.now();
          if (lastHeartbeatTime > 0 && now - lastHeartbeatTime > 10000) {
            console.error('心跳超时,断开连接');
            ws.close(1006, '心跳超时'); // 1006表示异常关闭
          }
        }
      }, HEARTBEAT_INTERVAL);
    }

    // 停止心跳检测
    function stopHeartbeat() {
      if (heartbeatTimer) {
        clearInterval(heartbeatTimer);
        heartbeatTimer = null;
      }
    }

    // 更新连接状态显示
    function updateStatus(text, color) {
      const colorClass = {
        green: 'bg-green-100 text-green-800',
        yellow: 'bg-yellow-100 text-yellow-800',
        red: 'bg-red-100 text-red-800',
        gray: 'bg-gray-100 text-gray-800'
      }[color] || 'bg-gray-100 text-gray-800';

      statusEl.className = `mb-4 p-2 rounded ${colorClass}`;
      statusEl.innerHTML = text;
    }

    // 绑定发送按钮事件
    sendBtn.addEventListener('click', sendMessage);
    // 回车发送消息
    messageInput.addEventListener('keypress', (e) => {
      if (e.key === 'Enter') sendMessage();
    });
  </script>
</body>
</html>

运行说明

  1. 启动服务器:

    • 安装依赖:npm install ws
    • 运行:node server.js(控制台显示「WebSocket 服务器启动,监听端口 8080」)
  2. 启动客户端:

    • 用浏览器打开 client.html
    • 客户端会自动连接服务器,状态显示「已连接」
    • 可在输入框输入消息,点击「发送」或按回车,消息会广播给所有连接的客户端

核心功能说明

  1. 消息收发:客户端发送文本消息,服务器广播给所有在线客户端。
  2. 心跳检测:
    • 客户端每 30 秒发送一次心跳消息(type: 'heartbeat')。
    • 服务器收到后立即回复心跳响应。
    • 若客户端 10 秒内未收到响应,判定连接失效并主动断开。
  3. 自动重连:
    • 连接断开后(非主动关闭),客户端自动重试连接。
    • 重连间隔从 1 秒开始,每次失败后加倍(1s→2s→4s...),最大 10 秒。
    • 重连成功后重置间隔为 1 秒。

通过以上实现,可确保 WebSocket 连接的稳定性和实时性,适合构建各类实时交互应用。

Spring WebSocket实现实时通信的详细教程 WebSocket 是基于TCP/IP协议,独立于HTTP协议的通信协议。WebSocket 连接允许客户端和服务器之间的全双工通信,以便任何一方都可以通过已建立的连接将数据推送到另一方。我们常用的HTTP是客户端通过「请求-响应」的方式与服务器建立通信的,必须是客户端主动触发的行为,服务端只是做好接口被动等待请求。而在某些场景下的动作,是需要服务端主动触发的,比如向客户端发送消息、实时通讯、远程控制等。 阅读详情

相关推荐

WebSocket(保姆级教学)

快速了解WebSocket,对WebSocket的介绍堪称保姆级,初学者上手即可使用

weixin_70563938的博客 6590

websocket原理详解

WebSocket本质上也是基于 TCP 上应用层协议,用来弥补http协议在持久通信能力上的不足。webSocket是一种在单个TCP连接上进行全双工双向通信的协议。WebSocket允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建长连接,并进行双向数据传输。WebSocket客户端与服务器通信的最小单位是帧(frame),一条完整消息是由一个或多个帧组成的。

weixin_40332490的博客 2624

WebSocket心跳机制:原理、实现与优化实践

WebSocket作为HTML5实时通信的核心技术,通过全双工通信实现了服务端与客户端的持久化连接。其底层基于TCP协议,但网络设备如NAT网关的会话超时机制会导致连接异常中断。心跳机制通过定期发送Ping/Pong控制帧,既能维持NAT映射表项,又能及时检测连接状态,这对在线协作编辑、金融实时报价等场景至关重要。本文以Node.js和浏览器环境为例,详解如何通过指数退避重连、自适应间隔调整等工程实践,将连接稳定性提升至99%以上。针对移动端网络切换、中间件拦截等典型问题,提供了经过电商大屏验证的TypeS

weixin_30846347的博客 287

webSocket详解:技术原理+前后端实现

webSocket详解:技术原理+前后端实现

zhang2312600_a的博客 1万+

WebSocket心跳机制:原理、实现与优化策略

WebSocket作为现代实时通信的核心技术,其心跳机制是保障连接可靠性的关键组件。从网络协议层看,心跳通过定期交换控制帧(Ping/Pong)来检测连接活性,解决了TCP层无法感知应用层断连的固有问题。在工程实践中,合理的心跳设计能有效应对移动网络切换、防火墙清理等典型故障场景,同时控制协议开销。通过实现双向确认机制和状态机管理,开发者可以构建高可用的实时系统,特别是在金融交易、在线协作等对延迟敏感的场景中。本文结合Node.js示例,详细解析了基础心跳实现、动态间隔算法等进阶技巧,并提供了生产环境中的性

weixin_31766003的博客 307

WebSocket核心原理与生产实战:从握手到心跳机制的完整解析

HTTP协议采用请求-响应模型实现服务端与客户端的交互,其单向通信机制在处理实时业务时逐渐显露瓶颈——服务端无法主动推送数据,客户端只能通过轮询反复追问,造成大量无效请求与资源浪费。为解决这一问题,WebSocket协议应运而生,它通过一次HTTP升级握手建立长连接,借助轻量帧格式实现全双工通信,显著降低消息延迟与带宽消耗。在聊天、行情推送、在线协作等高实时场景中,WebSocket已成为主流技术方案。然而建立连接只是起点,实际落地中,心跳机制的设计、断线重连策略、代理层空闲超时规避等工程问题才是保障长连接

weixin_33600816的博客 337

Websocket 原理,使用方法,心跳包机制(你想要了解的知识点!)

一. Websocket原理 什么是webSocket? webSocket是一种在单个TCP连接上进行全双工通信的协议 客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输 远古时期解决方案就是轮训:客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动(浪费流...

longlong6682的博客 7117

HTTP与WebSocket深度对比:协议原理、心跳机制与工程实战

HTTP协议采用请求-响应模型,适用于常规API调用,而WebSocket通过一次HTTP握手完成协议升级,建立全双工长连接,服务端可随时主动推送数据。实时通信需求下,轮询和长轮询会带来带宽与连接资源的浪费,WebSocket则以低延迟、低协议头开销和二进制传输能力,成为聊天、行情推送、协同编辑等场景的优选方案。围绕两者的核心差异,文章从协议原理、连接建立、帧格式、心跳机制与超时设置,到Nginx代理透传、负载均衡、鉴权安全以及内存泄漏等线上故障进行了系统梳理,并给出可落地的工程实践建议,帮助开发者针对“一

weixin_31960565的博客 195

WebSocket的原理及运行机制

Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现。这种机制对于信息变化不是特别频繁的应用可以良好支撑,但对于实时要求高、海量并发的应用来说显得捉襟见肘,尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是Web应用经常面临的问题,比如金融证券的实时信息、Web导航应用中的地理位置获取、社交网络的实时消息推送等。...

游戏服务器引擎Matchvs的博客 7420

WebSocket心跳机制的原理你知道多少?

不管是客户端发送心跳还是服务端发送心跳,连接都有断开的可能。例如浏览器最小化js被暂停、浏览器切换到其它tab页面js被暂停、电脑进入睡眠等等、移动端切换网络、信号变弱、手机黑屏、手机应用切换到后台、路由故障、业务主动断开等。尤其是外网环境复杂,很多路由节点会清理1分钟内不活跃的连接,这也是为什么心跳间隔推荐小于1分钟的原因。

前端程序员、项目经理、人工智能博主 1066

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 150

WebSocket心跳机制:从原理到实战优化

本文深入解析了WebSocket心跳机制的原理与实战优化。针对长连接中常见的“静默断开”问题,详细阐述了心跳机制如何通过定期发送Ping-Pong数据包来维持连接活性、检测网络状态。文章提供了完整的JavaScript心跳管理器实现代码,并探讨了自适应间隔、双重心跳、移动端优化及生产环境监控等进阶策略,帮助开发者构建稳定可靠的实时通信应用。

weixin_28363123的博客 316

【GNSS测试技术(一)】GNSS基础原理介绍

GNSS(全球卫星导航系统)是一种基于卫星信号的定位技术,通过使用分布在地球轨道上的卫星,为用户提供全球范围内的定位、导航和授时服务。

新猿异码的博客 5752

请讲讲websocket心跳机制原理

综上所述,WebSocket心跳机制是通过定时发送和接收空数据包来维持长连接的一种技术手段。它能够有效防止连接因长时间不通讯而自动断开,并及时检测和处理连接异常。在实际应用中,需要根据具体场景和需求来合理配置心跳间隔和重连策略。

王铁柱666的博客 465

手把手教学,Python 游戏编程之实现飞机大战(含源代码)

我想大家都是有玩过类似飞机大战的射击类游戏,也享受目标被消除通过后带来的愉悦感。那么如果用Python来实现飞机大战游戏?下面就跟大家一起用Python来做一个小游戏,不仅可以从中感受到乐趣,还可以提升自己的能力。

veratata的博客 1万+

病理组学分析系列教程1:使用Python-histolab进行病理图像预处理,tiles切片自动生成

病理图像tiles自动生成,WSI图像预处理

qq_43449643的博客 1741

聚焦于 WebSocket 协议的安全机制,结合您之前的问题(WebSocket、TCP、UDP、MQTT、QUIC、HTTP、串口、USB 等),我将详细讲解 WebSocket 安全机制的原理

聚焦于 WebSocket 协议的安全机制,结合您之前的问题(WebSocket、TCP、UDP、MQTT、QUIC、HTTP、串口、USB 等),我将详细讲解 WebSocket 安全机制的原理、实现方法,并提供 C# 代码示例(基于 .NET 8)展示安全的 WebSocket 服务端和客户端通讯,特别针对车牌识别场景。内容将包含中文解释,确保跨平台兼容性(Windows、Linux、macOS),并与上下文相关联(如 MQTT、QUIC 的安全机制)。1.2.3 数据完整性。1.4 跨平台注意事项。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 1234

[案例四] 智能填写属性工具(支持装配组件还有建模实体属性的批量创建、编辑)

本次案例主要是对上次导出自动导出BOM的一个前处理,要想导出属性,首先的有属性。于是本着学习的态度进行制作,可能有些功能有点别扭(支持装配环境下组件属性的批量填写,支持建模环境下的实体(不包括装配组件实体)——为了减负我把其过滤掉了,一般没人会往装配体里添加进行建模吧,但是不免有奇葩,哈哈哈)。

weixin_47753171的博客 1980

WebSocket心跳机制:从协议原理到高可用实践

本文深入解析WebSocket心跳机制的必要性及实现原理,探讨在高并发场景下的工程实践与性能优化技巧。通过Spring Boot实战配置和前端方案对比,提供从协议层到应用层的完整解决方案,帮助开发者构建高可用的WebSocket服务。

djph26741的博客 416

YoloV8改进策略:主干网络篇|MobileNetV4主干替换YoloV8的BackBone(独家原创)

今年,轻量级王者MobileNetV4闪亮登场!在我们这篇文章里,我们把MobileNetV4加入到了YoloV8中,替换原有的BackBone。哈哈,你猜怎么着?效果超赞!文章里详细记录了改进过程,给那些正在为创新点子发愁的小伙伴们提供了满满的灵感。嘿,想要发表关于轻量级改进的论文?这篇文章绝对是你的首选参考!

m0_47867638的博客 3192

基于逆向工程的中国裁判文书网爬虫技术深度解析:从反爬破解到合规抓取

最近承接了一个法律大数据分析的项目,需要获取某类合同纠纷的裁判文书数据,用于分析不同地区的判决规律、法官的裁判倾向以及法条适用情况。原本以为用常规的Python爬虫就能搞定,结果刚对着中国裁判文书网发了几个请求,就遭遇了“滑铁卢”:要么请求直接返回403 Forbidden,要么触发滑块验证码,甚至连IP都被临时封禁了。普通的requests+BeautifulSoup组合在裁判文书网面前完全失效,这也让我意识到,想要获取这里的数据,必须先通过逆向工程拆解网站的请求逻辑和反爬机制。经过一周的摸索,从抓包分析

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3170

终极指南:WebSocket协议实现原理与ws库核心机制详解

WebSocket技术彻底改变了Web应用的实时通信能力,让浏览器与服务器之间建立持久连接成为可能。本文将深入剖析WebSocket协议的实现原理,并通过ws库的源码解析,带你理解从握手到数据传输的完整流程。ws作为Node.js生态中最流行的WebSocket实现之一,其源码结构清晰、性能优异,是学习WebSocket协议底层机制的理想案例。 ## WebSocket协议基础:从HTTP到持久

gitblog_00726的博客 996

Qt入门教程【数据类型篇】数值类型

Qt中的数值类型

小鱼酱的博客 1万+

websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制

在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失。所以就需要一种机制来检测客户端和服务端是否处于正常的链接状态。因此就有了websocket的心跳了。还有心跳,说明还活着,没有心跳说明已经挂掉了。1. 为什么叫心跳包呢?它就像心跳一样每隔固定的时间发一次,来告...

weixin_39765869的博客 266

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SprinBoot——SpringBoot项目WebSocket推送(1),mybatis原理和实现机制

date 2018-09-20 */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 2.创建一个WebSocket推送类 package com.a 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 dc.da.p.

m0_64867152的博客 201

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: Web Worker 剖析与应用
codingMan_09
博客等级 码龄2年 29粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codingMan_09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值