WebSocket和STOMP协议之间的主要区别是什么?
长篇回答
WebSockets
它是一种规范,允许客户端和服务器之间进行异步双向通信。虽然类似于TCP套接字,但它是作为升级的HTTP连接运行的协议,而不是流式传输,通过两个参与方之间交换可变长度的帧。
STOMP
它定义了一个用于客户端和服务器进行消息语义通信的协议。它不定义任何实现细节,而是提供了一个易于实现的消息集成的传输协议。它在WebSockets协议之上提供更高级的语义,并定义了一些映射到WebSockets帧的帧类型。其中一些类型包括...
WebSocket 意味着一种消息架构,但不强制使用任何特定的消息协议。它只是 TCP 上的一个非常薄的层,将字节流转化为消息流(文本或二进制),并且没有更多的东西。这取决于应用程序来解释消息的含义。
与应用层协议 HTTP 不同,在 WebSocket 协议中,入站消息中没有足够的信息可以让框架或容器知道如何路由和处理它。因此,WebSocket 对于除了非常简单的应用之外似乎太低级了。虽然可以这样做,但可能会导致在其上创建一个框架。这类似于大多数现代 Web 应用程序使用 Web 框架而不是仅使用 Servlet API。
出于这个原因,WebSocket RFC 定义了子协议的使用。在握手期间,客户端和服务器可以使用头部 Sec-WebSocket-Protocol 来协商使用一个子协议,即更高级别的应用层协议。使用子协议并非必须,但即使不使用,应用程序仍需要选择一个客户端和服务器都能理解的消息格式。该格式可以是自定义、框架特定或标准的消息协议。
STOMP是一种简单的消息协议,最初为脚本语言创建,其帧受到HTTP的启发。STOMP得到广泛支持,并适用于WebSocket和Web使用。
WebSocket API允许Web应用程序处理双向通信,而STOMP是一种简单的面向文本的消息协议。双向WebSocket允许Web服务器向客户端发起新消息,而不是等待客户端请求更新。消息可以是任意协议,只要客户端和服务器达成一致。
STOMP协议通常在web socket内部使用。
一个很好的教程是Jeff Mesnill(2012)的WebSocket上的STOMP。
STOMP也可以在没有websocket的情况下使用,例如通过Telnet连接或消息代理服务。
原始WebSocket也可以在没有STOMP的情况下使用-例如Spring Boot + WebSocket示例没有STOMP和SockJs。
注意: 其他人已经很好地解释了WebSocket和STOMP的含义,所以我将尝试补充缺失的细节。
WebSocket协议定义了两种类型的消息(文本和二进制),但它们的内容是未定义的。
STOMP协议定义了客户端和服务器协商一种子协议 (即一种高层次的消息传递协议),用于在Websocket之上定义以下内容:
使用子协议是可选的,但无论如何,客户端和服务器都需要就定义消息内容的某些协议达成共识。
简短版; STOMP 是建立在 websockets 之上的框架,即 stomp 在后台使用了 websockets。如果您正在考虑构建通知/消息系统,请使用 stomp。