WebSocket协议与STOMP协议有什么区别?

173

WebSocket和STOMP协议之间的主要区别是什么?

5个回答

155
这个问题类似于询问TCP和HTTP之间的区别。我仍然会尝试回答你的问题,如果你刚开始接触,很自然会对这两个术语感到困惑。
简短回答:
STOMP通常是在更专门的协议(如WebSockets)之上实现的。STOMP描述了使用底层协议(如Websocket)在客户端和服务器之间交换消息帧的特定格式。

长篇回答

WebSockets

它是一种规范,允许客户端和服务器之间进行异步双向通信。虽然类似于TCP套接字,但它是作为升级的HTTP连接运行的协议,而不是流式传输,通过两个参与方之间交换可变长度的帧。

STOMP

它定义了一个用于客户端和服务器进行消息语义通信的协议。它不定义任何实现细节,而是提供了一个易于实现的消息集成的传输协议。它在WebSockets协议之上提供更高级的语义,并定义了一些映射到WebSockets帧的帧类型。其中一些类型包括...

  • connect(连接)
  • subscribe(订阅)
  • unsubscribe(取消订阅)
  • send(发送到服务器的消息)
  • message(从服务器发送的消息)BEGIN、COMMIT、ROLLBACK(事务管理)

2
-1 不对。这个答案以及其他大部分答案都是错误的!STOMP不是从WebSocket派生而来,并且默认情况下不使用WebSocket。请参阅https://dev59.com/PZjga4cB1Zd3GeqPL4sW#38160496和https://stomp.github.io/stomp-specification-1.2.html#Protocol_Overview。 - Federico Baù

53

WebSocket 意味着一种消息架构,但不强制使用任何特定的消息协议。它只是 TCP 上的一个非常薄的层,将字节流转化为消息流(文本或二进制),并且没有更多的东西。这取决于应用程序来解释消息的含义。

与应用层协议 HTTP 不同,在 WebSocket 协议中,入站消息中没有足够的信息可以让框架或容器知道如何路由和处理它。因此,WebSocket 对于除了非常简单的应用之外似乎太低级了。虽然可以这样做,但可能会导致在其上创建一个框架。这类似于大多数现代 Web 应用程序使用 Web 框架而不是仅使用 Servlet API。

出于这个原因,WebSocket RFC 定义了子协议的使用。在握手期间,客户端和服务器可以使用头部 Sec-WebSocket-Protocol 来协商使用一个子协议,即更高级别的应用层协议。使用子协议并非必须,但即使不使用,应用程序仍需要选择一个客户端和服务器都能理解的消息格式。该格式可以是自定义、框架特定或标准的消息协议。

STOMP是一种简单的消息协议,最初为脚本语言创建,其帧受到HTTP的启发。STOMP得到广泛支持,并适用于WebSocket和Web使用。


26

WebSocket API允许Web应用程序处理双向通信,而STOMP是一种简单的面向文本的消息协议。双向WebSocket允许Web服务器向客户端发起新消息,而不是等待客户端请求更新。消息可以是任意协议,只要客户端和服务器达成一致。

STOMP协议通常在web socket内部使用。

一个很好的教程是Jeff Mesnill(2012)的WebSocket上的STOMP

STOMP也可以在没有websocket的情况下使用,例如通过Telnet连接或消息代理服务。

原始WebSocket也可以在没有STOMP的情况下使用-例如Spring Boot + WebSocket示例没有STOMP和SockJs


9

注意: 其他人已经很好地解释了WebSocketSTOMP的含义,所以我将尝试补充缺失的细节。

WebSocket协议定义了两种类型的消息(文本和二进制),但它们的内容是未定义的。

STOMP协议定义了客户端和服务器协商一种子协议 (即一种高层次的消息传递协议),用于在Websocket之上定义以下内容:

  • 每个协议可以发送哪些类型的信息,
  • 格式是什么,
  • 每个消息的内容等。

使用子协议是可选的,但无论如何,客户端和服务器都需要就定义消息内容的某些协议达成共识。

参考资料


-1

你的答案可以通过添加额外的支持信息来改进。请[编辑]以添加更多细节,例如引用或文档,以便其他人可以确认你的答案是正确的。您可以在帮助中心找到有关编写良好答案的更多信息。 - Community
stomp 在后台使用了 websockets。不,它并不是这样的,它可以与 WebSocket 一起使用,详见 https://dev59.com/PZjga4cB1Zd3GeqPL4sW#38160496 和 https://stomp.github.io/stomp-specification-1.2.html#Protocol_Overview。 - Federico Baù

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接