经过《网络工程》的学习,咱们知道TCP/UDP是传输层协议,是应用层协议的基础。html
对于编程的语言的学习,咱们一般须要掌握Socket编程,而真正理解Socket编程与TCP/UDP协议的关系,能够说是一个开发者从初级突破到中级的一个最好证实。java
实际上Socket编程就是所谓的网络编程也就是基于TCP/UDP协议进行编程,就拿Java和TCP来讲:git
经过对ServerSocket进行封装,咱们能够实现本身的网络应用框架,例如:github
名称 | IO | 可解析的协议 |
---|---|---|
≤tomcat7 | BIO | HTTP等 |
≥tomcat8 | NIO | HTTP、Websocket等 |
Netty | NIO | TCP、HTTP、FTP、SMTP、Websocket等 |
Dubbo | 基于Netty | dubbo |
经过对Socket进行封装,咱们能够实现本身的客户端框架,例如:web
名称 | IO | 可解析协议 |
---|---|---|
OkHttp | BIO | HTTP、HTTPS |
WebSocketClient | BIO/NIO | Websocket |
WebClient | NIO | HTTP、HTTPS |
Upgrade:Websocket
头Header
的特殊HTTP request来实现与服务端握手HandShake
;小锤抠缝,大锤搞定
。HTML5规范中给出了原生的Websocket API,可是并非全部浏览器都完美支持,而当浏览器不支持Websocket时,应该自动切换成Ajax长轮询,SSE等备用解决方案。因此在实际开发中咱们一般采用封装了Websocket及其备用方案的库----SockJS或Socket.IO。spring
若是你使用Java作服务端,同时又刚好使用Spring Framework做为框架,那么推荐使用SockJS,由于Spring Framework自己就是SockJS推荐的Java Server实现,同时也提供了Java 的client实现。编程
若是你使用Node.js作服务端,那么毫无疑问你该选择Socket.IO,它本省就是从Node.js开始的,固然服务端也提供了engine.io-server-java实现。甚至你可使用 netty-socketio 注意:无论你使用哪种,都必须保证客户端与服务端同时支持。浏览器
STOMP(Simple (or Streaming) Text Orientated Messaging Protocol)一个简单的面向文本/流的消息协议。STOMP提供了可以协做的报文格式,以致于STOMP客户端能够与任何STOMP消息代理(Brokers)进行通讯,从而为多语言,多平台和Brokers集群提供简单且广泛的消息协做。tomcat
STOMP可用于任何可靠的双向流网络协议之上,如TCP和WebSocket。 虽然STOMP是面向文本的协议,但消息有效负载能够是文本或二进制。springboot
STOMP是一种基于帧的协议,帧的结构是效仿HTTP报文格式,简洁明了。以下:
COMMAND
header1:value1
header2:value2
Body^@
复制代码
STOMP over Websocket 即,经过Websocket创建STOMP链接,也就是说在Websocket链接的基础上再创建 STOMP链接。
WebSocket协议定义了两种类型的消息,文本和二进制,但它们的内容是未定义的。
若是说Socket是C/S的TCP编程,同理Websocket就是Web(B/S)的TCP编程,因此须要在客户端与服务端之间定义一个机制去协商一个子协议——更高级别的消息协议,将它使用在Websocket之上去定义每次发送消息的类别、格式和内容,等等。
子协议的使用是可选的,但不管哪一种方式,客户端和服务器都须要就一些定义消息内容的协议达成一致。
因而,一般选择在Websocket协议上使用STOMP协议来定义内容格式。