區別:Socket是TCP/IP網路的API,是為了方便使用TCP或UDP而抽像出來的一層,是位於應用層和傳輸控制層之間的一組介面;而WebSocket則是一個典型的應用層協定。
本教學操作環境:windows7系統、Dell G3電腦。
相關推薦:《程式設計影片》
WebSocket介紹與原理
WebSocket protocol 是HTML5一種新的協定。它實作了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要藉助HTTP請求完成。
——百度百科
網站上的即時通訊是很常見的,例如網頁的QQ,聊天系統等。依照以往的技術能力通常是採用輪詢、Comet技術解決。
HTTP協定是非持久化的,單向的網路協議,在建立連線後只允許瀏覽器向伺服器發出請求後,伺服器才能傳回對應的資料。當需要即時通訊時,透過輪詢在特定的時間間隔(如1秒),由瀏覽器向伺服器發送Request請求,然後將最新的資料傳回瀏覽器。這樣的方法最明顯的缺點就是需要不斷的發送請求,而且通常HTTP request的Header是非常長的,為了傳輸一個很小的資料 需要付出巨大的代價,是很不合算的,佔用了很多的寬頻。
缺點:會導致過多不必要的請求,浪費流量和伺服器資源,每一次請求、應答,都浪費了一定流量在相同的頭部資訊上
然而WebSocket的出現可以彌補這一缺點。在WebSocket中,只需要伺服器和瀏覽器透過HTTP協定進行一個握手的動作,然後單獨建立一條TCP的通訊通道進行資料的傳送。
WebSocket同HTTP一樣也是應用層的協議,但是它是一種雙向通訊協議,是建立在TCP之上的。
連接過程 —— 握手過程
WebSocket在建立握手時,資料是透過HTTP傳送的。但是建立之後,真正傳輸時候是不需要HTTP協定的。
Socket其實不是協議,而是為了方便使用TCP或UDP而抽像出來的一層,是位於應用層和傳輸控制層之間的一組介面。
Socket是應用層與TCP/IP協定族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協定族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織數據,以符合指定的協定.
當兩台主機通訊時,必須透過Socket連接,Socket則利用TCP/IP協定建立TCP連線。 TCP連線則更依賴底層的IP協定,IP協定的連線則依賴連結層等較低層次。
WebSocket則是典型的應用層協定。
Socket是傳輸控制層協議,WebSocket是應用層協議。
WebSocket API 是HTML5 標準的一部分, 但這並不代表WebSocket 一定要用在HTML 中,或只能在基於瀏覽器的應用程式中使用。
實際上,許多語言、框架和伺服器都提供了 WebSocket 支持,例如:
##以下簡單介紹一下WebSocket 的原理及運作機制。 WebSocket 是 HTML5 一種新的協定。它實現了瀏覽器與伺服器全雙工通信,能更好的節省伺服器資源和頻寬並達到即時通訊,它建立在TCP 之上,同HTTP 一樣透過TCP 來傳輸數據,但是它和HTTP 最大不同是:
WebSocket 是一種雙向通訊協議,在建立連接後,WebSocket 伺服器和Browser/Client Agent 都能主動的向對方發送或接收數據,就像Socket 一樣;WebSocket 需要類似TCP 的客戶端和伺服器端透過握手連接,連接成功後才能相互通訊。圖2.WebSocket 請求回應客戶端伺服器互動圖
#上圖比較可以看出,相對於傳統HTTP 每次請求-應答都需要客戶端與服務端建立連線的模式,WebSocket 是類似Socket 的TCP 長連線的通訊模式,一旦WebSocket 連線建立後,後續數據都以幀序列的形式傳輸。在用戶端中斷 WebSocket 連線或 Server 端中斷連線前,不需要用戶端和服務端重新發起連線請求。在大量並發及客戶端與伺服器交互負載流量大的情況下,極大的節省了網路頻寬資源的消耗,有明顯的效能優勢,且客戶端發送和接受訊息是在同一個持久連線上發起,即時性優勢明顯。我們再透過客戶端和服務端互動的封包看一下WebSocket 通訊與傳統HTTP 的不同:
在客戶端,new WebSocket 實例化一個新的WebSocket 用戶端對象,連接類似ws://yourdomain:port/path 的服務端WebSocket URL,WebSocket 用戶端物件會自動解析並識別為WebSocket 請求,從而連接服務端端口,執行雙方握手過程,客戶端發送資料格式類似:
清單1.WebSocket 用戶端連線封包
GET /webfin/websocket/ HTTP/1.1 Host: localhost Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg== Origin: http://localhost :8080 Sec-WebSocket-Version: 13 http://localhost :8080 Sec-WebSocket-Version: 13
可以看到,用戶端發起的WebSocket 連線封包類似傳統HTTP 封包,”Upgrade:websocket」參數值顯示這是WebSocket 類型請求,「Sec-WebSocket-Key」是WebSocket 用戶端發送的一個base64 編碼的密文,要求服務端必須傳回一個對應加密的「Sec-WebSocket-Accept」應答,否則客戶端會拋出「Error during WebSocket handshake」錯誤,並關閉連線。
服務端收到封包後回傳的資料格式類似:
清單2.WebSocket 服務端回應封包
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=
「Sec-WebSocket-Accept」的值是服務端採用與客戶端一致的密鑰計算出來後返回客戶端的,“HTTP/1.1 101 Switching Protocols”表示服務端接受WebSocket 協議的客戶端連接,經過這樣的請求-響應處理後,客戶端服務端的WebSocket 連線握手成功, 後續就可以進行TCP 通訊了。
在開發方面,WebSocket API 也十分簡單,我們只需要實例化WebSocket,創建連接,然後服務端和客戶端就可以相互發送和響應訊息,在下文WebSocket 實現及案例分析部分,可以看到詳細的WebSocket API 及程式碼實作。
WebSocket 實作
如上文所述,WebSocket 的實作分為客戶端和服務端兩部分,客戶端(通常為瀏覽器)發出WebSocket 連線請求,服務端回應,實現類似TCP 握手的動作,從而在瀏覽器用戶端和WebSocket 服務端之間形成一條HTTP 長連線快速通道。兩者之間後續進行直接的資料互相傳送,不再需要發起連線和對應。
WebSocket 服務端API
WebSocket 服務端在各個主流應用伺服器廠商中已基本獲得符合JEE JSR356 標準規範API 的支持,以下列舉了部分常見的商用及開源應用伺服器對WebSocket Server 端的支援情況:
廠商 | 應用程式伺服器 | 備註 |
---|---|---|
WebSphere | WebSphere 8.0 以上版本支持,7.X 先前版本結合MQTT 支援類似的HTTP 長連接 | |
WebLogic | WebLogic 12c 支持,11g 及10g 版本透過HTTP Publish 支援類似的HTTP 長連線 | |
#IIS | IIS 7.0支持 | |
Tomcat | #Tomcat 7.0.5+支持,7.0.2X 及7.0.3X 透過自訂API 支援 | |
Jetty | Jetty 7.0+支援 |
浏览器 | 支持情况 |
---|---|
Chrome | Chrome version 4+支持 |
Firefox | Firefox version 5+支持 |
IE | IE version 10+支持 |
Safari | IOS 5+支持 |
Android Brower | Android 4.5+支持 |
客户端 WebSocket API 基本上已经在各个主流浏览器厂商中实现了统一,因此使用标准 HTML5 定义的 WebSocket 客户端的 JavaScript API 即可,当然也可以使用业界满足 WebSocket 标准规范的开源框架,如 Socket.io。
以下以一段代码示例说明 WebSocket 的客户端实现:
清单 5.WebSocket 客户端 API 示例
var ws = new WebSocket(“ws://echo.websocket.org”); ws.onopen = function(){ws.send(“Test!”); }; ws.onmessage = function(evt){console.log(evt.data);ws.close();}; ws.onclose = function(evt){console.log(“WebSocketClosed!”);}; ws.onerror = function(evt){console.log(“WebSocketError!”);};
第一行代码是在申请一个 WebSocket 对象,参数是需要连接的服务器端的地址,同 HTTP 协议开头一样,WebSocket 协议的 URL 使用 ws://开头,另外安全的 WebSocket 协议使用 wss://开头。
第二行到第五行为 WebSocket 对象注册消息的处理函数,WebSocket 对象一共支持四个消息 onopen, onmessage, onclose 和 onerror,有了这 4 个事件,我们就可以很容易很轻松的驾驭 WebSocket。
当 Browser 和 WebSocketServer 连接成功后,会触发 onopen 消息;如果连接失败,发送、接收数据失败或者处理数据出现错误,browser 会触发 onerror 消息;当 Browser 接收到 WebSocketServer 发送过来的数据时,就会触发 onmessage 消息,参数 evt 中包含 Server 传输过来的数据;当 Browser 接收到 WebSocketServer 端发送的关闭连接请求时,就会触发 onclose 消息。我们可以看出所有的操作都是采用异步回调的方式触发,这样不会阻塞 UI,可以获得更快的响应时间,更好的用户体验。
想要查阅更多相关文章,请访问PHP中文网!!
以上是websocket和socket的差別是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!