經過《網絡工程》的學習,咱們知道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協議來定義內容格式。