WebSocket协议作为一种全双工通讯信息交互协议,客户端可以向服务端发送数据,服务端也能主动的向客户端推送数据。当然,采用Http协议也能达实时通讯的目的,无非是在客户端增加定时发送Http请求逻辑,然后服务端响应数据。但这种方式相比较WebSocket而言更加占用带宽和增加服务器的负担。因此在一些实时更新的系统中多采用WebSocket作为通讯方式,比如股票行情系统、排队叫号取号系统等
Websocket对比Http
先来看一次Http请求的数据格式是什么样子的

浏览器每访问一次后端服务器都需要携带这些Http协议的头信息,服务器处理数据后,按照Http协议定义好响应的头信息和数据返回给浏览器。
再来看一下WebSocket(以下简称ws)的数据格式是什么样子的。首先明确一点,ws定义了两种传输信息类型:文本信息和二进制信息。类型虽然被确定,但是他们的传输体是没有规定的,也就是说传输体可以自定义成什么样的数据格式都行,只要客户端和服务端约定好,得到数据后能够按照约定的语义解析数据就好。就好比Http,约定好了必须有请求头、请求体这类语义,接收到数据后先要解析头信息。
我们先用JSON作为传输体进行ws客户端与服务端通信。

在我编写的测试案例中,前端和后端数据传输体采用的是JSON格式。红色向下箭头表示服务器推送了一条JSON数据过来,绿色向上箭头表示发送了一条数据给服务器。
从这里也可以看出为什么ws省带宽和减轻服务器的负担,只要建立了ws连接,双方都采用定义的好的传输体格式(比如JSON格式)去解析数据即可,没有了Http协议那些头信息的解析工作和传输,也就提升了通讯效率。
STMOP协议
直接使用 WebSocket 就很类似于使用 TCP 套接字来编写 Web 应用。因为没有高层级的线路协议,因此就需要我们定义应用之间所发送消息的语义,还需要确保连接的两端都能遵循这些语义。比如在上述例子中我们就约定好了通过JSON语义。
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议。从名字也就看出来了这个协议是文本协议,也就是定义了传输体的内容格式。
就像HTTP在TCP套接字之上添加了请求-响应模型层一样,STOMP 在 WebSocket 之上提供了一个基于帧的线路格式(frame-based wire format)层,用来定义消息的语义。与HTTP请求和响应数据格式类似,STOMP帧由命令、一个或多个头信息以及负载所组成。
STMOP协议格式
SEND # 命令
destination:/queue/a #头信息
receipt:message-12345 #头信息
hello queue a # 负载
^@ # 帧结束标识
服务端和客户端按照这种格式去解析数据即可,而且提供的信息也比我们刚刚定义的JSON作为传输体丰富,比如SEND表示这是一条发送给服务器的信息,数据是“hello queue a”。更多的数据格式可以参考https://stomp.github.io/stomp-specification-1.2.html#STOMP_Frames。
下图是我测试STMOP的一条数据,其中MESSAGE表示从服务端主动推送了一条数据过来,接着就是一些头信息,然后业务数据内容为“hello~i’am Ethan”

总结
Websocket作为一种长连接,一旦TCP建立完成socket套接字后就可以采用自定义的文本传输格式进行服务端与客户端通讯,而STMOP就是一个很好的文本传输协议,即没有Http协议那样包含了太多的头信息而占用过多的网络带宽,又能提供比较丰富的格式语义方便双方的通讯。




