实时通讯技术Ajax,WebSocket,SSE

2023-05-16

实时通讯技术是一项基于web开发的重要技术,网站是需要前后端通讯的,因此数据刷新的时间就是获取信息的时间,为了能准确而有快速的获取信息需要尽可能的提高信息的刷新效率。

常见的实时通讯技术:

通讯方式AjaxCometWebSocketSSE
描述短轮询是浏览器端提交表单查询长轮询是服务器收到请求后如果有数据, 立刻响应请求; 如果没有数据就会 等待 一段时间,直到有数据后立刻响应请求; 如果时间到了还没有数据, 则响应 http 请求(定时刷新)WebSocket的实现了一次连接,双方通信的功能。首先由客户端发出WebSocket请求,服务器端进行响应,TCP三次握手。这个连接一旦建立起来,就保持在客户端和服务器之间,两者之间可以直接的进行数据的互相传送。在 sse 的场景下,客户端发起请求,连接一直保持,服务端有数据就可以返回数据给客户端,这个返回可以是多次间隔的方式。sse 是单通道,只能服务端向客户端发消息
通讯协议httphttpwebsockethttp

Ajax实现方案

Ajax及时通讯是比较方便实现的,通过浏览器DOM元素设定页面定时刷新就可以动态获取后端的数据。

  • 添加setinterval()函数
<script language="javascript">
	setInterval(function(){
		window.location.reload();
	},3000);   //每隔3000毫秒刷新一次
</script>
  • mata添加content元素间隔刷新
<meta http-equiv="refresh" content="20">
  • 定时跳转转页面
<mata http-equiv="refresh" content"3,url=#">

//定时跳转也会刷新数据

通过js的动态刷新技术,再在刷新同添加Ajax通讯技术就可实现动态刷新了。

基于Ajax的长轮询方式


	/*
    setInterval(() => {
        mychart2.clear();
        axios({
          method:'get',
          url:'http://localhost:8100/json',
        }).then(function (response) {
			console.log(response)
			
          temp=response.data
        })
	
        i=i+1;
        option.xAxis.data.push(i);
        option.xAxis.data.shift();
        option.series[0].data.push(temp.data);
        option.series[0].data.shift();
		
        mychart2.setOption(option);
    }, 3000);
	*/
	

上函数通过在定时刷新里面添加了axios技术在间隔时间内查询数据并添加到列表中以实现动态刷新。如下图所示:请添加图片描述

这种Ajax长轮询技术(Comet)的缺点是无法满足即时通信等富交互式应用的实时更新数据的要求。

基于Iframe的长轮询方式

该方法就是返回一个新的html,标记为src属性的变化。服务端将返回的数据作为回调函数的参数,浏览器在收到数据后就会执行脚本。

WebSocket实现方案

websocket通过握手连接,形成半双工的全通道通讯,由服务器和客户端都可以主动互相通讯。WebSocket可以让服务器直接给客户端发送信息,而不是先等客户端发起请求后、服务器才返回信息。(比起轮询,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

WebSocket官方网站

后台编写:

package com.example;



import java.io.IOException;
import java.util.logging.Logger;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;



/**
 * @Class: Test
 * @Description: 简单websocket demo
 */
@ServerEndpoint(value="/websocketTest/{userId}")
public class WsTest {

    private Logger logger = Logger.getLogger("WebSocket");

    private static String userId;

    int i=0;

    //连接时执行
    @OnOpen
    public void onOpen(@PathParam("userId") String userId,Session session) throws IOException{
        this.userId = userId;
        logger.info("有新的链接!");
        System.out.println("新连接:"+userId);
    }

    //关闭时执行
    @OnClose
    public void onClose(){

        logger.info("有链接关闭!");

        System.out.println("连接:"+this.userId);
    }

    //收到消息时执行
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        System.out.println("收到用户"+this.userId+"的消息"+message);
        //session.getBasicRemote().sendText("服务器 "+this.userId+" 发送来一条消息的消息 "); //回复用户
        i++;
        session.getBasicRemote().sendText(String.valueOf(i));  //返回数据
    }

    //连接错误时执行
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("用户id为:"+this.userId+"的连接发送错误");
        error.printStackTrace();
    }


}

前端编写:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
websocket Demo---- user000 <br />
<input id="text" type="text" />
<button onclick="send()"> Send </button>
<button   onclick="closeWebSocket()"> Close </button>
<div id="message">   </div>

<script type="text/javascript">
    //判断当前浏览器是否支持WebSocket
    if('WebSocket' in window){
        websocket = new WebSocket("ws://localhost:8080/demo/websocketTest/user000");
        console.log("link success")
    }else{
        alert('Not support websocket')
    }

    //连接发生错误的回调方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    //连接成功建立的回调方法
    websocket.onopen = function(event){
        setMessageInnerHTML("open");
    }
    console.log("-----")
    //接收到消息的回调方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }

    //连接关闭的回调方法
    websocket.onclose = function(){
        setMessageInnerHTML("close");
    }

    //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    //将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    //关闭连接
    function closeWebSocket(){
        websocket.close();
    }

    //发送消息
    function send(){
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
</script>

</body>
</html>

启动tomcat服务器访问websocket前端界面后返回数据:

在这里插入图片描述

SSE实现方案

SseEmitter的用法是使用 HTTP 做服务端数据推送应用的技术。SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议。

SSE 和 WebSocket 做的是同一件事情。当你需要用新数据局部更新网络应用时,SSE 可以做到不需要用户执行任何操作,便可以完成。SSE 是单向通道,只能服务器向客户端发送消息,如果客户端需要向服务器发送消息,则需要一个新的 HTTP 请求。 这对比 WebSocket 的双工通道来说,会有更大的开销。

这是SpringMVC提供的一种技术,可以实现服务端向客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其send方法发送数据。因此sse需要在spring mvc或更集成的框架中使用,在servlet中无法使用。

SpringMVC内置SseEmitter类内置了几个方法,可以令我相当方便地使用服务器推送事件(Server Sent Event)。

在使用前有几个关于sse的前端知识需要了解

  1. sse机制不同于传统的“请求-响应”模型,在前端必须使用新建的EventSource对象请求一个sse,
    然后监听此对象的message事件以接收后端推送的值。

  2. 在前端请求一个sse时,在后端未主动关闭和事件未超时前服务器都不会对此请求做出响应以实现“连接”的效果, 一旦后端响应这个请求(后端主动或“连接”自动超时)则代表“连接”结束;

  3. 前端一旦接收到响应则EventSource对象会立刻自动重新连接以保证连接的有效性。

    const source = new EventSource('http://localhost/sse');
    source.addEventListener('message', (message: any) => {
      console.log(message.data);
    });

使用SseEmitter的步骤

  1. 直接创建SseEmitter对象即可,创建时可设置一个超时时间(默认为30000毫秒),当达到此时间则立刻对请求响应(连接失效)。
    SseEmitter sse() throws IOException {

        SseEmitter event = new SseEmitter(10000L);

        // 添加一些额外配置
        event.send(
                SseEmitter.event()
                        .reconnectTime(1000L)
                        .id("123")
        );

        concurrentHashMap.put(1, event);
        return event;
    }
  1. 发送事件可以调用创建好的对象的send方法,发送的数据即为在前端的接收到的message事件中的data属性值

  2. 发送的数据默认被识别为字符串,如果发送Map则在前端需要用JSON对象解析才能得到json数据

        event.send(
                SseEmitter.event()
                        .data("值")
                        // 更改原来的“message”事件名称
                        .name("event")
        );
  1. 对于服务器端返回的响应,浏览器端需要在 JavaScript 中使用 EventSource对象来进行处理。EventSource 使用的是标准的事件监听器方式,只需要在对象上添加相应的事件处理方法即可。EventSource 提供了三个标准事件。
    在这里插入图片描述
var es = new EventSource('events');
es.onmessage = function(e) {
    console.log(e.data);
};
 
es.addEventListener('myevent', function(e) {
    console.log(e.data);
});

在指定 URL 创建出 EventSource 对象之后,可以通过 onmessage 和 addEventListener 方法来添加事件处理方法。当服务器端有新的事件产生,相应的事件处理方法会被调用。EventSource 对象的 onmessage 属性的作用类似于 addEventListener( ‘ message ’ ),不过 onmessage 属性只支持一个事件处理方法。

  1. SSE对象是服务端向客户端发送信息,因此需要周期性执行,需要借助线程功能。ScheduledExecutorService是基于ExecutorService的功能实现的延迟和周期执行任务的功能。每个任务以及每个任务的每个周期都会提交到线程池中由线程去执行,所以任务在不同周期内执行它的线程可能是不同的。ScheduledExecutorService接口的默认实现类是ScheduledThreadPoolExecutor。在周期执行的任务中,如果任务执行时间大于周期时间,则会以任务时间优先,等任务执行完毕后才会进入下一次周期。如下面所示:

/*
 数据实时推送sse数据推送
  */
//ScheduledExecutorService```是基于ExecutorService的功能实现的延迟和周期执行任务的功能
 ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

 @GetMapping(value = "/timeclick")
 public SseEmitter subscribeCC(){

     //获取数据库点击量数据
     //List<ClickTimes> clickTimes = null;

     SseEmitter sseEmitter = new SseEmitter(0L);
     executorService.scheduleWithFixedDelay(new Runnable() {
         @Override
         public void run() {
             try {
                 sseEmitter.send(opt1Mapper.select_all_times());
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }, 10,5, TimeUnit.SECONDS);  //每个任务10执行时间,每个5秒执行一次

     return sseEmitter;
 }

借助ScheduledExecutorServicescheduleWithFixedDelay方法周期性执行任务。

SSE案例

//接口是在spring boot的controller下实现的

 /*
    数据实时推送sse数据推送
     */
    ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();

    @GetMapping(value = "/timeclick")
    public SseEmitter subscribeCC(){

        //获取数据库点击量数据
        //List<ClickTimes> clickTimes = null;

        SseEmitter sseEmitter = new SseEmitter(0L);
        executorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                try {
                    sseEmitter.send(opt1Mapper.select_all_times());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, 10,5, TimeUnit.SECONDS);  //每个任务10执行时间,每个5秒执行一次

        return sseEmitter;
    }


 function initEventSource() {
        //请求地址,静态
        const url = "/timeclick"


        //接受实时推送数据的监听EventSource对象接收
        const dataSource = new EventSource(url);

        dataSource.onmessage= function (event){
            console.log("SSE--->收到数据")
            const vo = JSON.parse(event.data)
            //调用更新实时数据方法
            updateClickChart(vo)
        }

    }

在timeclick接口下,后台借助ScheduledExecutorService周期性返回数据,前端借助EventSource对象接收,再调用其他方法将接受的数据更新。所以sse技术适用用可视化方案。

在这里插入图片描述

上述的单车点击项目即sse的项目,放在资源里了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实时通讯技术Ajax,WebSocket,SSE 的相关文章

  • UML--类之间的五种关系

    UML中的关系 xff08 Relationships xff09 主要包括5种 xff1a 关联关系 聚合关系 依赖关系 泛化关系 实现关系 1 关联 xff08 Association xff09 关系 关联关系是一种结构化的关系 xf
  • stm32并行驱动LCD12864,最简洁代码让你的屏幕亮起来

    前言 这两天因为一个项目的需要 xff0c 所以又用到了LCD12864这个模块 好久都没用到这玩意了 xff0c 感觉这东西好像要被淘汰的样子 xff0c 没想到现在又要用到 xff0c 简直了 记得上次用还是大一参加机器人比赛的时候 x
  • GCC编译过程,了解编译原理

    说明 xff1a 这篇文件是在读 程序员的自我修养 链接 装载与库 的一点笔记 xff0c 权当时学习的记录 1 GCC编译过程分解 以HelloWorld程序为例 2 预编译 规则 xff1a 命令 xff1a gcc E XXX c o
  • 谨以此文献给正在面临选择的你

    我是2011届的考生 xff0c 当我从我们学校的的分数公布栏上看到自己的分数时 xff0c 我感觉我的世界都变成了灰色 xff0c 一切都暗淡无光 在那段时间里 xff0c 我思考了很多的问题 xff0c 诸如要不要去复读 去哪一所学校
  • Linux - Ubuntu里安装Python的包

    在Ubuntu中 xff0c apt install python xff0c 默认是安装python2 要安装python3 要使用apt install python3 安装后运行python python2 xff0c 调用的都是py
  • 第二章:STM32MxCube配置串口

    基于上一次将第一章 xff1a STM32MxCube 基本使用方法 本章直接讲叙述STM32配置串口2的 查看STM32F407电路图 xff1a 可得USART2接在PA2 PA3 下面新建STM32MxCube工程 xff0c 开始配
  • 浅述数字化与信息化

    数字化 和 信息化 是两个被用 滥 了的词 xff0c 但是搞 IT 的一定要真正理解这两个词 xff0c 才能在正确的场合使用在正确的地方 数字化 xff08 to digitize xff09 简单的说就是用计算机技术来代替一些传统手动
  • 飞书扫码登录网页

    二维码 SDK 接入文档 最后更新于 2022 06 14 概述 为了实现在网页内部完成授权登录的流程 xff0c 避免跳转到飞书登录页 xff0c 保证流畅的体验 xff0c 可以接入二维码 SDK 将飞书登录的二维码嵌入到网页中 当用户
  • make命令参数详解

    Make命令本身可带有四种参数 xff1a 标志 宏定义 描述文档名和目标文档名 其标准形式为 xff1a Make flags macro definitions targets Unix系统下标志位flags选项及其含义为 xff1a
  • c语言汉诺塔问题详解

    一 前言 汉诺塔 xff08 Tower of Hanoi xff09 xff0c 又称河内塔 xff0c 是一个源于印度古老传说的益智玩具 大梵天创造世界的时候做了三根金刚石柱子 xff0c 在一根柱子上从下往上按照大小顺序摞着64片黄金
  • 阿里云服务器的使用

    阿里云服务器的使用 外网ip 39 108 98 xxx xff08 linux xff09 ubuntu16 04 root root密码 putty ssh工具 xshell ssh scp 登录到阿里云服务器上 xff08 ubunt
  • 项目如何介绍

    谈谈XXX项目 分析 xff1a 考官通过看你的简历或者你的介绍来了解你所做的项目 xff0c 那么考官肯定想更详细的了解您的项目 xff0c 看是不是与你的简历写的项目经验一致 也就是考核你是否具有真实的项目经验 一般来说 xff0c 在
  • K8S的flannel组件容器网络分析

    kubernetes的网络通信可以分为一下几个部分 xff1a pod内部的容器间通信pod间通信pod与service之间网络通信kubernetes外部与service之间的网络通信 理论 xff1a 1 pod内部的容器间通信 kub
  • 数据结构(Data Structure)——1、栈(Stack)

    栈的介绍 栈 xff08 stack xff09 在计算机科学中是限定仅在表尾进行插入或删除操作的线形表 栈是一种数据结构 xff0c 是只能在某一端插入和删除的特殊线性表 它按照先进后出的原则存储数据 xff0c 先进入的数据被压入栈底
  • 进程间通信之消息队列

    首先说一下什么是消息队列 消息队列是进程间通信的一种 xff0c 它是由操作系统维护的以字节序列为基本单位的间接通信机制 xff0c 它提供了一个进程向另一个进程发送一个带类型的数据块的方法 我们知道用管道来实现进程间通信的机制是两个进程利
  • STM32 编码器模式详解

    0 编码器模式 stm32的定时器带的也有编码器模式 所用的编码器是有ABZ三相 xff0c 其中ab相是用来计数 xff0c z相输出零点信号 AB相根据旋转的方向不同 xff0c 输出的波形如下图所示 xff1a 从图上可以看出来 xf
  • LAN8720A网络模块关于时钟的使用问题

    微雪的LAN8720A驱动电路 xff1a 正点原子LAN8720A驱动电路 xff1a 1 nINTSEL Configuration 从原理图中可以看出正点原子的LAN8720A模块所使用的晶振是25M 而微雪的LAN8720A模块使用
  • 机器学习和深度学习大纲

    机器学习 https blog csdn net qq 45056216 article details 104303569 深度学习 https blog csdn net weixin 42237113 article details
  • VIM 助记符

    https www bilibili com video BV114411J7Z8 from 61 search amp seid 61 9900190950002805677 一 工作模式 vim其实三种模式 xff0c 一般模式 xff
  • STLINK下载程序(附STLINK驱动包)

    一 ST Link V2的JTAG SWD接口定义及产品图 实物图 STLINK指定标准接口 xff1a 二 STLINK驱动安装 xff1a 双击ST LinkUpgrade安装即可 安装成功之后 xff0c 设备管理器 三 打开工程文件

随机推荐

  • STM32 之 HAL库

    1 STM32的三种开发方式 通常新手在入门STM32的时候 xff0c 首先都要先选择一种要用的开发方式 xff0c 不同的开发方式会导致你编程的架构是完全不一样的 一般大多数都会选用标准库和HAL库 xff0c 而极少部分人会通过直接配
  • 迷你版的ARDUINO MEGA2560

    1 传统的MEGA2560板 xff1a 2 迷你的MEGA2560 特点 xff1a 嵌入版Mega 2560 CH340G ATmega2560 兼容 Mega 2560主板 基于Atmel ATmega2560微控制器和USB UAR
  • MATLAB撸了一个2D LiDAR SLAM

    0 引言 刚刚入门学了近一个月的SLAM xff0c 但对理论推导一知半解 xff0c 因此在matlab上捣鼓了个简单的2D LiDAR SLAM的demo来体会体会SLAM的完整流程 1 数据来源 xff1a 德意志博物馆Deutsch
  • 基于粒子滤波的定位算法 ——原理、理解与仿真

    1 算法原理 1 1 机器人定位问题 关于机器人定位 xff0c 有三大问题 xff0c 它们分别是 xff1a 1 全局定位 xff1a 指初始位置未知 xff0c 机器人靠自身运动确定自己在地图中的位姿 2 位姿跟踪 xff1a 指已知
  • 从图片中提取曲线坐标数据--基于MATLAB

    转载 https zhuanlan zhihu com p 52112012 0 引言 在读文献的时 xff0c 经常遇到这样的情况 xff1a 文章里提出的方法好有趣啊 xff0c 好想拿文中用的数据来试试看看能不能得到相近的结果 xff
  • 49天精通Java,第8天,JDK 和 JRE 、final 与 static 、堆和栈

    作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经700 订阅 CSDN最
  • Python 之 Serial串口通信

    0 Serial方法 1 导入pyserial模块 import serial 2 打开串行口 打开串口0 xff0c 9600 xff0c 8N1 xff0c 连接超时0 5秒 import serial ser 61 serial Se
  • PYTHON字符串转数字,数字转字符串;数字转bytes,bytes转数字;字符串转bytes,bytes转字符串。数字表达字符串

    字符串str转数字 float str int str 数字num转字符串 str num a 61 39 1234 39 print 39 a 61 39 a print type a b 61 int a print 39 b 61 3
  • 杂记 | Linux中修改docker默认访问端口(2375)

    2375端口是docker的默认访问端口 xff0c 使用该端口可实现远程访问和操作docker xff0c 但在服务器上直接开启该端口有安全风险 xff08 笔者本人今天就应该端口导致服务器被入侵 xff09 xff0c 可以修改该默认端
  • RVIZ中的fixed frame选项以及“For frame [XX]: Fixed Frame [map] does not exist”

    RVIZ 使用的时候如果fixed frame选项设置不正确 xff0c 那么就会无法显示显示相应的数据信息 xff0c 并提示一下错误 xff1a For frame XX Fixed Frame map does not exist 官
  • C++常见面试题总结

    本文主要总结了一些常见的C 43 43 面试题 链接现在不让发 xff0c 所以如果需要整理好的文档的话 xff0c 请关注本篇文章底部的推广订阅公众号获取 xff1a Cpp编程小茶馆 进入正题 xff0c 下面是自己整理的文档目录截图
  • ROS系统安装Kinetic(零基础教程)

    文章目录 一 引言二 安装过程2 1 配置软件库2 2 添加ROS软件源2 3 添加密钥2 4 安装ROS2 4 初始化rosdep2 5 设置环境变量2 5 构建工厂依赖 三 测试过程3 1 启动ROS Master3 2 启动小海龟仿真
  • 《C++ Primer》一书极不适合我国“国情”

    客气地说 xff0c C 43 43 Primer 不适合大学C 43 43 基础课堂教学 xff0c 也不适合初学者入门 不客气地说 xff0c 恐怕你们的大学老师也搞不定 C 43 43 Primer xff0c 更别说拿这本书教学生了
  • 肝了两宿才收集的17个超炫酷的 CSS 动画加载与进度条特效,绝对值得收藏!!!

    文章目录 一 圆形加载动画二 上下跳动的圆球加载动画三 3D立体加载动画四 饼图加载动画五 多色圆点波动效果的加载动画六 制作顺时针放大的圆圈加载动画七 制作小圆圈轮流放大的加载动画八 制作竖条加载动画九 制作水波扩散效果加载动画十 制作逆
  • C 语言学习笔记(三):C 语言开发环境搭建

    文章目录 一 Windows二 Linux2 1 VMware Workstation Pro软件简介及安装2 2 安装 Ubuntu 系统2 2 1 Ubuntu 下载2 2 2 安装 Ubuntu2 2 3 安装共享文件夹 2 3 概念
  • windows和虚拟机ROS串口通信

    windows和虚拟机ROS串口通信 ROS串口通信步骤1 windows下安装VSPD xff08 虚拟串口工具 xff09 2 VMWare虚拟机添加串口3 Windows下串口通信测试工具设置4 ROS通信代码5 运行结果 最近在学习
  • jsonp原理详解——终于搞清楚jsonp是啥了

    一 JSONP的由来 1 Ajax直接请求普通文件存在跨域无权限访问的问题 xff0c 不管是静态页面 动态页面 web服务 xff0c 只要是跨域请求 xff0c 一律不准 2 不过我们发现 xff0c web页面调用js文件则不受跨域的
  • 无人机分类

    无人机分类方式 一 按飞行平台构型分类 无人机可分为固定翼无人机 多旋翼无人机 无人飞艇 伞翼无人机 扑翼无人机等 固定翼无人机 固定翼 xff0c 顾名思义 xff0c 就是机翼固定不变 xff0c 靠流过机翼的风提供升力 跟我们平时坐的
  • python网络编程smtp协议发送电子邮件

    SMTP协议 SMTP 的全称是 Simple Mail Transfer Protocol xff0c 即简单邮件传输协议 它是一组用于从源地址到目的地址传输邮件的规范 xff0c 通过它来控制邮件的中转方式 SMTP 协议属于 TCP
  • 实时通讯技术Ajax,WebSocket,SSE

    实时通讯技术是一项基于web开发的重要技术 xff0c 网站是需要前后端通讯的 xff0c 因此数据刷新的时间就是获取信息的时间 xff0c 为了能准确而有快速的获取信息需要尽可能的提高信息的刷新效率 常见的实时通讯技术 xff1a 通讯方