【问题标题】:Should I use a WebSocket or a normal TCP Socket?我应该使用 WebSocket 还是普通的 TCP Socket?
【发布时间】:2016-02-05 10:12:35
【问题描述】:
我正在开发一个 Web 应用程序,它有一个用 Java 编写的桌面客户端。我正在使用 WebSockets 在 NodeJS 服务器和 Web 客户端之间进行通信。
我正在尝试决定是使用 WebSocket 还是普通的 TCP 套接字在 NodeJS 服务器和桌面客户端之间进行通信。
据我了解,使用 WebSocket 会更容易,但重量也会重一些。
如何做出这个决定?
【问题讨论】:
标签:
node.js
sockets
tcp
websocket
【解决方案1】:
这取决于您的具体用例:
- WebSockets 是通过首先进行 HTTP 连接,然后将其升级到 WebSocket 协议来建立的。因此,交换第一条消息所需的开销比简单的套接字要高得多。但是,如果您只是保持连接打开并通过单个已建立的套接字交换所有消息,那么这并不重要。
- 由于屏蔽,性能开销很小。但这些主要是简单的计算 (XOR),因此它们应该无关紧要。
- 由于成帧,它需要更多的带宽。但这应该无关紧要。
- 从积极的方面来说,它与现有的防火墙和代理一起工作得更好(但并不总是完美),因此它更容易集成到现有的基础设施中。您还可以更轻松地将其与 TLS 一起使用,因为这只是 HTTPS 内部的 WebSocket 升级,而不是 HTTP 内部的升级。
因此,如果您必须使用防火墙和代理集成到现有基础架构中,那么 WebSockets 可能是更好的选择。如果您的应用程序性能很重,并且需要每一点带宽、处理器时间和最低(初始)延迟,那么普通套接字会更好。
除此之外,如果延迟确实是个问题(例如实时音频),那么您最好不要使用任何基于 TCP 的协议,例如 TCP 套接字或 WebSocket。在这种情况下,使用 UDP 并处理应用程序内部潜在的数据包丢失、重新排序和重复可能会更好。
【解决方案2】:
对于您实现桌面客户端的任何技术,是否有合适的 WebSocket 库? The websocket protocol 并非微不足道,它是一种相当新的技术,尚未得到普遍支持。当您必须使用纯 TCP/IP 套接字从头开始实现 WebSocket 时,您可以计划花几天时间,直到您有基本的协议实现工作并可以开始在它之上实现您自己的协议(去过那里,做过,扔了)当有一个比我自己的实现更好的库可用时,它就消失了)。
但是,如果您可以为您的桌面客户端找到 Websocket 实现,那么您可以通过让网站和桌面客户端以相同的方式与 node.js 后端进行通信来节省服务器端的一些工作和复杂性。