这是对 websocket 编程的适当使用吗?

Posted

技术标签:

【中文标题】这是对 websocket 编程的适当使用吗?【英文标题】:Is this an appropriate use of websocket programming? 【发布时间】:2013-09-26 13:58:14 【问题描述】:

我对 websockets 主题非常陌生,并且正在尝试找出处理设备和服务器之间通信的正确方法。

这是我的场景:我有一个恒温器(非常类似于 Nest),它需要与 Web 服务器通信。每次您更改恒温器上的温度时,我都需要将数据发送到 Web 服务器以更新它在数据库中的“当前统计信息”。简单,我能做到。

我感到困惑并认为 websockets 可能是一个用例的部分是当用户从 web 界面更改温度时。恒温器必须从服务器中提取该信息才能看到“哦,好吧,你希望它是 66 度”。

我曾想过让恒温器每 2-5 秒对服务器进行一次长轮询,以查看数据库中的“当前统计信息”是什么来改变温度,但这似乎有点过头了。

有没有办法打开恒温器和服务器之间的连接来监听消息?

我开始阅读有关 websockets 的文章,但是,不幸的是,我相信它只是基于浏览器的。

由于我对这些类型的连接还很陌生,如果有人能在协议、通信等方面为我指出正确的方向,我将不胜感激!

技术规格

服务器是用 Ruby on Rails 编写的

恒温器是用 Java 编写的

【问题讨论】:

【参考方案1】:

Websockets 可以在任意两个需要通信的程序之间使用,当然不限于浏览器。也就是说,应该您使用 websockets 是一个不同的问题。要考虑的一件事是 websockets 涉及 持久 连接。这可能无法扩展(如果您有很多设备),也可能是矫枉过正。如果您期望温度每天更改一次,那么一整天的持久连接是对资源的巨大浪费。当通信需要“快速”且相对频繁时,通常使用 websocket。除非您真的需要恒温器中的即时更新,否则我只会让它每隔几分钟 ping 服务器以进行更新。

旁注,websockets 是相当新的,所以你最终使用的任何库都可能有点不成熟。

不久前,我们制作了一些 java 到 java websockets 的原型。我们在客户端使用ning async 库,在服务器端使用atmosphere 库(基于netty 构建)。

【讨论】:

如果服务器每 5-10 秒检查一次房间的温度,那(除了所述功能之外)会怎样?这更像是 Web 套接字的用例吗? 好的,很高兴知道。实际上,我使用这个 ruby​​ 框架github.com/gimite/web-socket-ruby 快速设置了一个 websocket 服务器和客户端,并且运行良好。你现在让我对“资源浪费”感到好奇。恒温器可能每天只更换一次,但问题是如果通过移动应用程序更换,恒温器必须立即知道。我要么每 2 秒长时间轮询一次服务器以检查更改,要么打开一个持久连接。任何关于哪种方式比另一种方式“浪费”少的见解以及为什么? @BrianW - 为什么恒温器需要立即做出反应?当我在家更换恒温器时,需要几分钟才能启动,谁知道实际达到目标温度需要多长时间。 @dostrander - 是的,这可能更有意义。但是,您仍然可以询问您是否真的需要经常检查。我知道空调运行时,我家的温度不会每 10 秒变化一次。【参考方案2】:

WebSockets 只是一个规范,用于通过 HTTP 建立类似于 TCP 套接字的隧道;它不仅限于浏览器,客户端库可用于大多数常用语言。

这听起来像是长时间运行连接的合理用例,但我通常更喜欢原始 TCP 连接而不是 WebSockets 连接,除非您有特定的限制(例如,大多数家庭互联网连接都没有连接问题到任意端口的服务器)。

【讨论】:

以上是关于这是对 websocket 编程的适当使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

websocket.send() 参数

WebSockets...它们不安全吗?

使用 websockets lib 和 Python3.7 启动服务器的适当方法

这是一个适当的完成处理程序吗?

细说websocket - php篇

如何定位对所有浏览器做出适当响应的页脚?