服务器推送数据你还在用 WebSocket么?

这篇具有很好参考价值的文章主要介绍了服务器推送数据你还在用 WebSocket么?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

当涉及到推送数据时,人们首先会想到 WebSocket。

的确,WebSocket 允许双向通信,可以自然地用于服务器到浏览器的消息推送。

然而,如果只需要单向的消息推送,HTTP 通过服务器发送的事件也有这种功能。

WebSocket 的通信过程如下:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

首先,通过 HTTP 切换协议。服务器返回 101 状态码后,协议切换成功。

然后,开始以 WebSocket 格式的数据通信,任意一方都可以随时向另一方推送消息。

至于 HTTP 中的服务器发送的事件:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

服务器返回的 Content-Typetext/event-stream,这是一种可以多次返回内容的流。

服务器发送的事件通过这种类型的消息随时推送数据。

你可能是第一次听说 SSE,但你已经使用过基于它的应用程序。

例如,你使用的 CI/CD 平台会实时打印日志。

那么它如何实时传输构建日志呢?

它需要分次传输,SSE 通常用于以这种方式推送数据。

另一个例子是 ChatGPT。它在回答问题时不会一次给你所有答案,而是逐步分块加载。

这也是基于 SSE 的。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

现在我们已经知道 SSE 是什么以及它的应用,让我们自己实现它。

创建一个 Nest 项目。

npx nest new sse-test

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

运行它:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

访问 http://localhost:3000 会显示“Hello World”,表示服务器运行成功。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

然后在 AppController 中添加一个流接口。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

这里没有用 @Get@Post 等装饰器进行标识,而是 @Sse 装饰器表示这是一个事件流类型的接口。

@Sse('stream')
stream() {
    return new Observable((observer) => {
      observer.next({ data: { msg: 'aaa'} });

      setTimeout(() => {
        observer.next({ data: { msg: 'bbb'} });
      }, 2000);

      setTimeout(() => {
        observer.next({ data: { msg: 'ccc'} });
      }, 5000);
    });
}

返回的是 Observable 对象,然后在内部使用 observer.next 返回消息。可以返回任何 JSON 数据。我们首先返回 aaa,2 秒后返回 bbb,5 秒后返回 ccc。然后创建一个前端页面:创建一个 React 项目。

npx create-react-app --template=typescript sse-test-frontend

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

App.tsx 中编写以下代码:

import { useEffect } from 'react';

function App() {

  useEffect(() => {
    const eventSource = new EventSource('http://localhost:3000/stream');
    eventSource.onmessage = ({ data }) => {
      console.log('New message', JSON.parse(data));
    };
  }, []);

  return (
    <div>hello</div>
  );
}

export default App;

这个 EventSource 是浏览器的原生 API,用于获取 SSE 接口的响应。它会将每个消息传入回调函数 onmessage 中。

我们在 Nest 服务中启用跨域支持。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

然后删除 react 项目中的 index.tsx 文件中的这几行代码,因为它们会导致额外的渲染:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

执行 npm run start

因为 3000 端口被占用,它将在 3001 上运行:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

访问浏览器:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

看到响应了吗?

这就是服务器发送的事件。

devtools 中,你可以看到响应的 Content-Typetext/event-stream

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

然后在 EventStream 中,你可以看到接收到的每条消息。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

通过这种方式,服务器可以随时向网页推送消息。

它的兼容性如何?

你可以在 MDN 上看到。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

除了 IE 和 Edge 外,与其他浏览器没有兼容问题。

一般来说,安全使用。

它可以在哪里使用?

服务器发送的事件 特别适合只需要服务器端推送的场景。

例如日志的实时推送。

让我们测试一下:

“tail -f”命令允许你实时查看文件的最新内容。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

我们使用 child_process 模块的 exec 函数来执行这个命令,然后监听它的 stdout 输出。

const { exec } = require("child_process");

const childProcess = exec('tail -f ./log');

childProcess.stdout.on('data', (msg) => {
    console.log(msg);
});

使用 node 执行它。

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

然后添加一个 SSE 接口。

@Sse('stream2')
stream2() {
const childProcess = exec('tail -f ./log');

return new Observable((observer) => {
  childProcess.stdout.on('data', (msg) => {
    observer.next({ data: { msg: msg.toString() }});
  })  
});

检测到新数据后,返回到浏览器。

浏览器连接到这个新接口:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

测试如下:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

可以看到浏览器已经接收到实时日志。

许多构建日志都是通过 SSE 实时推送的。

日志和类似的东西只是文本,但是如果是二进制数据呢?

在 Node.js 中,二进制数据存储在 Buffer 中。

const { readFileSync } = require("fs");

const buffer = readFileSync('./package.json');

console.log(buffer); 

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

Buffer 有一个 toJSON 方法:

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

这可以通过 SSE 接口返回吗?

试一下:

@Sse('stream3')  
stream3() {
    return new Observable((observer) => {
        const json = readFileSync('./package.json').toJSON();
        observer.next({ data: { msg: json }});
    });
}

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

服务器推送数据你还在用 WebSocket么?,服务器,websocket,运维

的确可以。

换句话说,基于 SSE,除了可以推送文本,还可以推送任何二进制数据。

概括

可以使用 WebSocket 或 HTTP 的服务器发送事件(SSE)从服务器推送实时数据。

通过在 HTTP 响应中返回一个 Content-Type 为 text/event-stream 的头,可以通过流多次发送消息。

传输的内容是 JSON 格式,可以用来传输文本或二进制内容。

我们使用 Nest 实现了 SSE 接口。方法使用 @Sse 装饰器进行注释,它返回一个 Observable 对象。可以使用 observer.next 随时返回数据。

在前端,使用 EventSource 的 onmessage 来接收消息。

这个 API 在除 IE 和 Edge 外的其他浏览器有很好的兼容性,可以安全使用。

它有各种应用,如内部消息传递、构建日志的实时显示和 chatgpt 的消息响应。

当遇到需要消息推送的场景时,考虑使用服务器发送的事件而不是 WebSocket。文章来源地址https://www.toymoban.com/news/detail-800504.html

到了这里,关于服务器推送数据你还在用 WebSocket么?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity使用webSocket与服务器通信(三)——C#服务端(Fleck)与Unity客户端( NativeWebSocket)传输多种数据数据

    1、字符串数据 简单的字符串:比如登录请求信息,登录结果返回的信息。 用json系列化的字符串:比如上传一个表到服务器,让它写入到数据库中。 读取文件的时候,读取的是string内容。 2、二进制数据 比如传输的是文件:例如myword.doc,myexcel.xls或者是assetboundle文件。 比如

    2023年04月08日
    浏览(53)
  • SSE(服务器推送事件)规范

    SSE 是指 \\\"Server-Sent Events\\\",即服务器推送事件。它是一种基于 HTTP 的服务器推送技术,允许服务器实时向客户端推送数据。SSE 规范定义了一种在客户端和服务器之间单向实时通信的方式,通常用于实现服务器向客户端推送更新、通知或实时数据。 使用 SSE,客户端可以通过简单

    2024年01月18日
    浏览(56)
  • git 新建 branch 推送 到服务器

    通常情况下,需要开发一个模块,从 master 新建立了一个 分支,newbranch,如果推送到服务器; 1:从远程 master 建立本地分支 newbranch;     git checkout -b newbranch origin/master 2:当修改完成代码,add,commit 完成后,执行 git push; 提示: git push  的全部参数: git push 远程主机名 本地

    2024年02月07日
    浏览(45)
  • 【GIT】代码仓库服务器变更本地修改并推送

    author: jwensh date: 20231122 没有使用域名的 gitlb 服务器搬移(IP地址变了), 以至于 gitlab 管理的项目无法进行连接及推送。因为涉及到多个项目工程,所以可以用本地配置修改的方式来进行重新关联( 这种修改 remote 的方式适用于多个平台代码仓库间同步代码 ) old_ip:http://

    2024年02月03日
    浏览(47)
  • 极光Java 版本服务器端实现别名消息推送

    REST API 文档:

    2024年02月15日
    浏览(48)
  • Springboot集成Docker并将镜像推送linux服务器

    案例使用springboot项目,在IDEA 中集成Docker生成镜像,并将镜像发布到linux服务器 具体步骤如下: 更新系统的软件包列表 安装Docker所需的软件包和依赖项: 完成安装后,启动Docker服务。在终端中运行以下命令: 验证Docker是否成功安装。在终端中运行以下命令: linux查看docke

    2024年02月09日
    浏览(34)
  • 【Spring Boot 实现 WebSocket实时数据推送-服务端】

    一、WebSocket配置类 二、WebSocket服务端类 三、WebSocket的连接池类 四、启动Spring Boot服务 五、测试WebSocket连接 WebSocket在线测试工具: http://www.easyswoole.com/wstool.html 测试连接 服务地址:ws://172.18.42.29:14785/endPoint/1 服务启动的IP:172.18.42.29 服务端口:14785 WS的URl:/endPoint 入参:1 六

    2023年04月25日
    浏览(41)
  • 企业微信消息推送(一)接收消息服务器URL

    1.点击左上角头像,打开微信管理平台 2.创建应用 3.获取五个参数 3.1获取应用的AgentId、Secret 3.2获取企业ID 配置接收消息服务器URL 企业微信限制过多,公司域名所有权检验不通过。采用接收消息服务器URL的方式。 3.3 获取token、EncodingAESKey 4.1 内网穿透、本地开发 先将请求打到

    2024年02月04日
    浏览(45)
  • 【ASP.NET Core】使用SignalR推送服务器日志

    一个多月前接手了一个产线机器人项目,上位机以读写寄存器的方式控制机器人,服务器就是用 ASP.NET Core 写的 Web API。由于前一位开发者写的代码质量问题,导致上位机需要16秒才能启动。经过我近一个月的改造,除了保留业务逻辑代码,其他的基本重写。如今上位机的启动

    2024年02月03日
    浏览(60)
  • 【10秒开服】幻兽帕鲁全自动部署教程,难道你还想手动搭建游戏服务器吗?快来学习这个简单又快速的方法!

    在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 引用自:https://store.steampowered.com/app/1623730/P

    2024年02月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包