根据此博客,Mosquitto(MQTT经纪人)现在支持通过Web套接字连接到客户端。该博客文章似乎暗示Web套接字对浏览器应用程序更有用,因为Web浏览器尚不支持正确的TCP套接字(尽管),尽管大多数现代浏览器都支持Web套接字协议。

如果我在网络中只有各种客户端(例如,基于微控制器(例如Raspberry Pis)的传感器和执行器),那么使用Web套接字而不是直接TCP连接会有任何优势吗?仅当与浏览器进行通信时,Web套接字协议的开销才值得吗?

评论

您能否告诉我们您是否正在对整个网络进行编码?即所有节点还是客户端和服务器?或者,如果您必须与他人的软件进行交互?听起来您可能只在编码客户端,但是我不确定

@Mawg服务器将是Mosquitto MQTT代理,但我可以选择我为所有客户端使用的协议(而Mosquitto提供Web套接字和直接TCP连接,这就是我问的原因)。

我认为这里有些混乱。我假设@ Auroa0001通过“直接TCP”的含义是在TCP上使用MQTT,而不是在Websockets(...上通过TCP)使用MQTT。在这两种情况下,都有可用的库,因此无需为套接字编写任何代码。

@ralight是的,那确实是我问问题时的意图。看来,答案确实误入歧途。

#1 楼

这里的问题似乎是“我应该在TCP上使用MQTT,还是在websockets(也通过TCP)上使用MQTT?”换句话说,“将MQTT封装在websockets协议中是一个好主意吗?”

(几乎)完全取决于您的应用程序以及您是否需要websockets支持-可能是在浏览器中使用消息或出于防火墙原因。如果无法通过端口1883或更高的8883来访问服务器以获取纯MQTT,则websockets可能是您的最佳选择。只有您能回答的问题。

还值得注意的是,在当前版本的Mosquitto中,Websocket不能很好地工作,因此在发送/接收Websockets消息时可能会有额外的延迟。但这在将来的版本中将不会成为问题。

#2 楼

当您仅在网络(内部网)内部通信时,使用纯TCP即可。但是,如果必须连接到另一台服务器,则会出现问题。

,因为大多数现代服务器不允许客户端通过随机端口进行连接。它们仅允许某些专用端口进行连接。就这样。因此,如果必须连接到另一台服务器,最好使用websocket而不是纯TCP连接。如果您想了解更多关于websocket的开销的信息,可以参考这篇文章。

我个人认为,除非您有一些严重的顾虑,否则最好始终使用websocket。

评论


Err,TCP和websocket是协议:tools.ietf.org/html/rfc6455,此外,TCP是底层的套接字。

–古法利特
16 Dec 20 '13:11

@ThisaruGuruge感谢您的回答-在我的问题中,我假设您根据回答来判断,通过Web套接字选择TCP是吗?尤其是由于Web套接字似乎主要受浏览器支持,因此存在在TCP套接字上使用Web套接字的代码开销。

–Aurora0001♦
16 Dec 20'在16:20

“大多数现代服务器不允许客户端通过随机端口进行连接”-服务器可以选择绑定到哪个端口(man7.org/linux/man-pages/man2/bind.2.html),并且防火墙可以进一步限制。但是,如果您说“如果必须连接到另一台服务器,则会出现问题”,我并不同意。改写为“可能出现”。即使这样,也只需要配置,哪种websocket可能比原始套接字更容易。

–莫格说要恢复莫妮卡
16 Dec 20 '23:04



#3 楼

tl; dr-始终喜欢使用自由库对自己进行编码(除非您有极端要求)



我应该使用Mosquitto的Web套接字还是直接连接客户端?


一根弦多长时间? (YMMV)

我只能说一般,但是我总是更喜欢包装库而不是原始套接字(或者实际上是编码任何我可以从库中免费获得的东西)。

它们使编码更简单,更不容易出错。他们负责许多内部管理和错误处理,这是您必须自己编写和调试的代码,因为通常对库进行充分的审查和测试,并正在成千上万的其他人使用它们。将为您报告/修复错误。

此外,您维护(以及可能移植)的代码更少,这意味着您有更多的时间来开发,测试和完善您的应用,或继续进行下一个应用。

唯一的开销可以说是函数调用,如果您接受了所有图书馆员的善良(错误处理,软管维护等),则必须自己编写代码才能获得良好,稳定的性能,软件。

如果您担心性能,只需配置文件即可。但是,除非您的套接字每秒活动数百次,否则我什至不会打扰。

评论


好了,有免费的TCP连接和(web)socket连接库,并且都需要“接收消息”事件。

–古法利特
16 Dec 20 '13:11

OP想要知道使用TCP或Websocket来提高效率是否更好,并且您说“使用抽象库,这样您就不会打扰”。当然可以,但是哪一个呢?在C#中,System.Net.Sockets中有一个TcpClient库(好吧...),而nuget包中的websocket库(WebSocketSharp)。我同意所有语言都有通用的MQTT库,但是OP希望对其进行控制以选择必须使用的协议。

–古法利特
16年12月21日在8:49