【填坑向】从mqtt的连接异常来区分ws:// 和 tcp://

145 阅读3分钟

为什么ws://xx.xx.xxx.xxx/mqtt就连接不上,但是tcp://xx.xx.xxx.xxx/mqtt可以连接上???

不知道你有没有碰到过这类问题,我们今天通过这个问题,来介绍下在现代网络通信领域的两种核心协议:ws://(websocket) 和 tcp://(Transmission Control Protocol),在 Vue 项目中集成 MQTT 服务时,理解这两种协议的差异对于确保高效和稳定的网络连接至关重要~

  1. TCP(Transmission Control Protocol)
  1. TCP 是一种面向连接的、可靠的、基于字节流的传输层通信协议。由于 MQTT 协议在设计上即建立在 TCP 之上,使用 tcp:// 连接 MQTT 服务器意味着正在使用的是其原生协议,这种方式的优势在于它通常提供更快的连接速度和更高的可靠性,但是这种直接的 TCP 连接可能需要在网络防火墙中开放特定的端口,这可能在某些受限网络环境中成为障碍。

  2. WebSocket(WS)

  1. WebSocket 提供了一种在 Web 浏览器和服务器之间进行全双工通信的机制。通过 ws:// 连接 MQTT 服务器,实际上是在使用一个通过 WebSocket 封装的 MQTT 协议连接。这种方法的优势在于它能够复用 HTTP(S) 端口(通常是 80 或 443),从而更容易穿透网络防火墙。尽管如此,WebSocket 连接可能会因为额外的封装和解封装过程而相对慢一些。

在那在 Vue 项目中,我们应该选择使用哪种协议呢?

应该基于项目的具体需求和网络环境:

  • 如果服务器和客户端位于同一内部网络,或者能够配置网络防火墙,那么 TCP 连接可能是更优的选择;

  • 相反,如果服务器和客户端分布在不同的网络,或者网络环境受到限制,WebSocket 可能更为合适。

那么我们距离“为什么 ws://xx.xx.xxx.xxx/mqtt 无法连接而 tcp://xx.xx.xxx.xxx/mqtt 可以正常连接”这个问题的答案也就不远了,可能的原因包括(我是第一种原因导致的,大家是哪种原因可以对号入座下~~)

  1. 服务器配置问题

MQTT 服务器必须配置 WebSocket 支持才能接受 ws:// 连接,如果服务器未正确配置,它可能无法处理 WebSocket 连接,而只能接受基于 TCP 的连接,需要检查服务器配置或与服务器管理员联系(确保 WebSocket 连接被正确允许)。

  1. 网络防火墙限制

网络防火墙可能配置为阻止 WebSocket 流量,同时允许 TCP 流量,由于 WebSocket 通常使用的标准 HTTP 端口可能被错误地限制,需要检查防火墙设置或尝试在不同的网络环境下连接。

  1. 浏览器兼容性问题

尽管现代浏览器普遍支持 WebSocket,但仍有可能遇到不支持的情况,如果使用的浏览器不支持 WebSocket,将无法通过 ws:// 连接,但可以通过 tcp:// 连接,需要检查浏览器兼容性(或在其他浏览器中测试连接)。

  1. 客户端实现问题

如果客户端代码存在问题,可能无法正确建立 WebSocket 连接。需要审查代码,确保使用了合适的 MQTT 客户端库,并正确实现了 WebSocket 连接逻辑。