我正在创建一个应用程序(Nuxtjs),并且在确定向API(expressjs)发送数据和检索实时更新的好方法时遇到了困难。我似乎可以使用protocals服务器发送事件(SSE)和Axios或Websocket(WS)创建"bi-di“连接。
这两种技术都适用于大多数浏览器,因此我认为没有必要为那些没有当前浏览器的个人添加额外的库(如socket.io )(太糟糕了)。
该应用程序基于用户输入的表单数据/单击。然后用这些信息通知/更新其他用户。在这一点上,用户可以响应和链继续(基本聊天,如流,一些信息将被迅速交换,而有些可能不会或永远不会)。
根据我的经验,与实际更改数据相比,用户流更多地依赖于侦听更改--因此我考虑使用SSE__。不幸的是,这两项协议都有缺陷。
Websockets:
WS来获取/发布信息,因此升级一个基本的http连接而需要额外的服务器费用是没有意义的。因此,除了WS之外,还需要另一种方法(Axios/SSR)。Example: Checking to see if a user name existsWS操作properlyexpress-ws,从而使API端可以拥有6个以上的并发连接。
服务器发送事件
WS
WS
WS
expressjs API中使用node-spdy --这也可能是WS的一个很好的实现,因为multiplexing
http2并发出SSE(丑陋的代码)--所以函数将是made)
TLDR
该应用程序将以更多的“提要”为导向,偶尔发布(这可以由Axios处理)。然而,用户将监听多个“提要”,HTTP限制将是一个问题。我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手真的无关紧要(从我所读到的一切来看都不是这样),那么WS很可能是一个更好的选择。不幸的是,关于这两种情况,有很多相互矛盾的信息。
有什么想法?
发布于 2019-11-07 01:39:47
SSE、Web和普通HTTP请求(通过AJAX或Fetch API)都是针对不同作业的不同工具。
SSE
Web套接字
标准HTTP请求
从客户端到服务器或服务器到客户端,但一次只有一个方向。在从客户机到服务器的realtime.
如何决定:
根据您的描述,这听起来像是SSE或Web套接字适合您的用例。我可能倾向于SSE,同时使用普通的HTTP请求从客户机发送随机API调用。
我不知道解决方案是什么,因为SSE似乎是更好的选择,因为我不需要不断地握手。如果这种握手确实无关紧要(我所读到的情况并非如此),那么WS很可能是一个更好的选择。
请记住,您可以简单地配置您的服务器与HTTP保持活力,使这一点毫无意义。
发布于 2019-11-07 01:10:36
我个人避免使用websockets作为client和server之间的双向通信。
我尝试对broadcast data from server to users or a single user(socket)使用套接字,以便它们能够获得实时更新,但是对于客户机到服务器的post请求,我倾向于使用axios或类似的东西,因为我不想将敏感数据(如访问键等)从client传递到server。
我的数据流就像
whatever
axios、SSE或服务器将数据发布到服务器,并通知套接字事件有occured有谁。
我使用套接字将数据从客户端发送到服务器的问题是身份验证问题。从技术上讲,您不能通过套接字传递客户端javascript不可用的任何,这意味着要对操作进行身份验证,必须通过websocket发送敏感信息。这是一个有多种原因的问题--如果您的敏感数据可以使用客户端js访问,那么这里可以进行大量的攻击。另外,还可以有人收听ws与客户端之间的通信。这就是为什么我使用API调用(axios等)并将敏感数据存储到仅http的cookie中。
因此,一旦服务器想通知用户发生了什么事情,您就可以通过告诉websocket服务器向用户发送数据来轻松地做到这一点。
您还希望保持API服务器的无状态状态,这意味着API中没有套接字。我只为websocket连接使用单独的服务器,我的API服务器和websocket服务器使用redis进行通信。Pub/sub对于内部服务器通信和状态管理来说是一个非常整洁的特性。
为了回答您关于多个连接的问题--您可以在websocket服务器和客户端之间使用单个连接,并使用频道广播数据。因此,一个频道将用于通知提要,另一个频道可能用于故事提要等。
我希望这对你有意义。这堆东西对我真的很管用。
https://stackoverflow.com/questions/58740029
复制相似问题