首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器发送事件和Ajax与Websockets和Ajax

服务器发送事件和Ajax与Websockets和Ajax
EN

Stack Overflow用户
提问于 2019-11-06 23:48:01
回答 2查看 1.4K关注 0票数 1

我正在创建一个应用程序(Nuxtjs),并且在确定向API(expressjs)发送数据和检索实时更新的好方法时遇到了困难。我似乎可以使用protocals服务器发送事件(SSE)和Axios或Websocket(WS)创建"bi-di“连接。

这两种技术都适用于大多数浏览器,因此我认为没有必要为那些没有当前浏览器的个人添加额外的库(如socket.io )(太糟糕了)。

该应用程序基于用户输入的表单数据/单击。然后用这些信息通知/更新其他用户。在这一点上,用户可以响应和链继续(基本聊天,如流,一些信息将被迅速交换,而有些可能不会或永远不会)。

根据我的经验,与实际更改数据相比,用户流更多地依赖于侦听更改--因此我考虑使用SSE__。不幸的是,这两项协议都有缺陷。

Websockets:

  1. 并不是所有的组件都需要WS来获取/发布信息,因此升级一个基本的http连接而需要额外的服务器费用是没有意义的。因此,除了WS之外,还需要另一种方法(Axios/SSR)。Example: Checking to see if a user name exists
  2. Security防火墙可能会阻止WS操作properly
  3. express-ws,从而使API端
  4. 上的套接字变得容易,我相信一个用户(可能是赞成和反对)

可以拥有6个以上的并发连接。

服务器发送事件

WS

  • Listening技术似乎正在逐渐向WS

  • No倾斜,事件似乎就像监听事件一样容易,因为WS

  • No需要升级连接,但必须在expressjs API中使用node-spdy --这也可能是WS的一个很好的实现,因为multiplexing

  • Little有更多的后端代码来安装http2并发出SSE(丑陋的代码)--所以函数将是made)

  • Limited到HTTP的限制(6个并发连接),这是一个问题,因为用户可以很容易地将其扩展出去(例如。打开多个聊天窗口)

TLDR

该应用程序将以更多的“提要”为导向,偶尔发布(这可以由Axios处理)。然而,用户将监听多个“提要”,HTTP限制将是一个问题。我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手真的无关紧要(从我所读到的一切来看都不是这样),那么WS很可能是一个更好的选择。不幸的是,关于这两种情况,有很多相互矛盾的信息。

有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-07 01:39:47

SSE、Web和普通HTTP请求(通过AJAX或Fetch API)都是针对不同作业的不同工具。

SSE

  • Unidirectional,仅从服务器到client.
  • Text-based数据。(其他任何东西都必须序列化,即JSON.)
  • Simple API,它广泛兼容,自动重新连接,它内置了用于追赶可能错过的事件的规定。

Web套接字

  • Bi-directional.
  • Text或二进制data.
  • Requires为发送的数据实现自己的意义。

标准HTTP请求

从客户端到服务器或服务器到客户端,但一次只有一个方向。在从客户机到服务器的realtime.

  • Streaming中,为了在realtime.

  • Streaming中传输服务器到客户端的响应,

  • 文本或二进制需要在请求时知道整个数据。(例如,您不能执行事件流。)

如何决定:

  • 您是否将类似事件的数据从服务器流到客户端?使用SSE。它的目的是为了实现这个目标,这是一个非常简单的方法。
  • 您是在向一个方向发送数据,而不需要自发地通知客户?使用正常的HTTP请求。
  • ,您需要发送具有长期建立的连接的双向数据吗?使用网络套接字.

根据您的描述,这听起来像是SSE或Web套接字适合您的用例。我可能倾向于SSE,同时使用普通的HTTP请求从客户机发送随机API调用。

我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手确实无关紧要(我所读到的情况并非如此),那么WS很可能是一个更好的选择。

请记住,您可以简单地配置您的服务器与HTTP保持活力,使这一点毫无意义。

票数 0
EN

Stack Overflow用户

发布于 2019-11-07 01:10:36

我个人避免使用websockets作为clientserver之间的双向通信。

我尝试对broadcast data from server to users or a single user(socket)使用套接字,以便它们能够获得实时更新,但是对于客户机到服务器的post请求,我倾向于使用axios或类似的东西,因为我不想将敏感数据(如访问键等)从client传递到server

我的数据流就像

whatever

  • Backend

  • 用户使用axiosSSE或服务器将数据发布到服务器,并通知套接字事件有occured
  1. Socket服务器,然后通知

有谁。

我使用套接字将数据从客户端发送到服务器的问题是身份验证问题。从技术上讲,您不能通过套接字传递客户端javascript不可用的任何,这意味着要对操作进行身份验证,必须通过websocket发送敏感信息。这是一个有多种原因的问题--如果您的敏感数据可以使用客户端js访问,那么这里可以进行大量的攻击。另外,还可以有人收听ws与客户端之间的通信。这就是为什么我使用API调用(axios等)并将敏感数据存储到仅http的cookie中。

因此,一旦服务器想通知用户发生了什么事情,您就可以通过告诉websocket服务器向用户发送数据来轻松地做到这一点。

您还希望保持API服务器的无状态状态,这意味着API中没有套接字。我只为websocket连接使用单独的服务器,我的API服务器和websocket服务器使用redis进行通信。Pub/sub对于内部服务器通信和状态管理来说是一个非常整洁的特性。

为了回答您关于多个连接的问题--您可以在websocket服务器和客户端之间使用单个连接,并使用频道广播数据。因此,一个频道将用于通知提要,另一个频道可能用于故事提要等。

我希望这对你有意义。这堆东西对我真的很管用。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58740029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档