我有 X 数量的活动传感器连接到服务器,每次触发传感器时都会将数据插入数据库。我想要做的是创建一个带有设施蓝图(svg)的Web界面,并且每当触发传感器时,除了数据库插入之外,我希望它在我的蓝图中显示某种警报。为此,我需要与我认为的服务器保持开放连接。
我正在考虑使用 Web 套接字,但这可能有点矫枉过正,因为我只需要从服务器检索数据。但是每秒运行一个 ajax 调用听起来也不是很有效。还有其他选择吗?
谢谢
我有 X 数量的活动传感器连接到服务器,每次触发传感器时都会将数据插入数据库。我想要做的是创建一个带有设施蓝图(svg)的Web界面,并且每当触发传感器时,除了数据库插入之外,我希望它在我的蓝图中显示某种警报。为此,我需要与我认为的服务器保持开放连接。
我正在考虑使用 Web 套接字,但这可能有点矫枉过正,因为我只需要从服务器检索数据。但是每秒运行一个 ajax 调用听起来也不是很有效。还有其他选择吗?
谢谢
一些潜在的选择包括:
您最终使用哪种实际传输将取决于您对浏览器支持的要求以及您在服务器上使用什么技术来处理这些请求。传输选择还可能取决于您的网络拓扑 - 您需要集成哪些类型的负载均衡器、代理等。
客户端和服务器端都有许多可用的库,其中许多支持不止一种这些传输。
例如(不是详尽的列表):
IMO -对于此类问题,Websockets并不过分,并且非常适合此类应用程序。
在没有专门讨论框架或不知道服务器后端运行什么的情况下,我们有一些前端选项可供考虑:
网络套接字
Websockets 是为双向通信而设计的,尽管令人震惊的是有多少用户在不支持 websockets 的浏览器中浏览网页。我总是为此推荐一个备用方法,例如下面列出的其他方法。
上证所
SSE 是 HTML5 规范,充其量仍然不稳定。尝试在 SSE 事件触发时在页面上滚动......在后端可能会更容易一些,有时会挂在客户端,因为它在运行 DOM 的同一线程中运行。
长轮询
保持连接打开。它不能很好地与 PHP 一起扩展,但在后端使用 Python+Twisted 或 Node.Js 时可以很好地执行
好老阿贾克斯
保持你的请求很小,你仍然有一个可扩展的解决方案。是的,完整的 GET 请求是最昂贵的,但在过去十年推出的几乎所有浏览器都支持。还值得注意的是,GET 请求很容易通过更多硬件进行水平扩展。
在一个完美的世界里:
您可以将应用程序分解为几个组件,在 Nginx 等反向代理后面运行。然后使用 Node.Js + Socket.IO 处理应用程序的实时方面。
另一种选择是使用小型 Ajax 请求,并为支持它的浏览器提供 websocket 支持。这是专门针对后端 PHP 的建议。
我有一个类似的问题,并对此做了很多研究。据我了解,主要有以下三种选择:
我认为 websocket 是您最好的选择,因为它可以适应事件的即时通信,而无需所有请求/响应开销。最重要的是,这正是 websocket 的设计初衷!因此,您可能必须使用此解决方案编写最少的自定义代码。
WebSocket 当然不是矫枉过正。相反。使用 websockets,你有一个双向的通信通道;这意味着,服务器可以在合适的时候启动通信(例如,当传感器数据发生变化时)。
在之前的项目中,我使用了node.js和socket.io来监控 50 多个传感器。数据在浏览器中实时更新。使用Smoothie.js可视化数据。每当更新传感器值时,都会将其传达给浏览器。一些传感器每分钟只更新一次,而另一些传感器每秒更新一次,...... 轮询将是多余的,因为它会检索所有传感器的所有数据,即使是那些尚未更新的数据。