webService、webSocket、socket、http之間的區別
HTTP
HTTP 是基於請求響應式的,即通訊只能由客戶端發起,服務端做出響應,無狀態,無連線。
無狀態:每次連線只處理一個請求,請求結束後斷開連線。
無連線:對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。
以往實現即時通訊的手段:
輪詢:客戶端定時向伺服器傳送 Ajax 請求,伺服器接到請求後馬上返回響應資訊並關閉連線。
長輪詢:客戶端向伺服器傳送 Ajax 請求,伺服器接到請求後 hold 住連線,直到有新訊息才返回響應資訊並關閉連線,客戶端處理完響應資訊後再向伺服器傳送新的請求。
長連線:在頁面裡嵌入一個隱蔵 iframe,將這個隱蔵 iframe 的 src 屬性設為對一個長連線的請求,伺服器端就能源源不斷地往客戶端輸入資料。
Flash Socket:在頁面中內嵌入一個使用了 Socket 類的 Flash 程式 JavaScript 通過呼叫此 Flash 程式提供的 Socket 介面與伺服器端的 Socket 介面進行通訊,JavaScript 在收到伺服器端傳送的資訊後控制頁面的顯示。
webSocket
為什麼需要webSocket
HTTP 協議有一個缺陷:通訊只能由客戶端發起。
舉例來說,我們想了解今天的天氣,只能是客戶端向伺服器發出請求,伺服器返回查詢結果。HTTP 協議做不到伺服器主動向客戶端推送資訊。
這種單向請求的特點,註定瞭如果伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。我們只能使用"輪詢":每隔一段時候,就發出一個詢問,瞭解伺服器有沒有新的資訊。最典型的場景就是聊天室。
輪詢的效率低,非常浪費資源(因為必須不停連線,或者 HTTP 連線始終開啟)。因此,工程師們一直在思考,有沒有更好的方法。WebSocket 就是這樣發明的。
WebSocket 協議在2008年誕生,2011年成為國際標準。所有瀏覽器都已經支援了。
它的最大特點就是,伺服器可以主動向客戶端推送資訊,客戶端也可以主動向伺服器傳送資訊,是真正的雙向平等對話,屬於伺服器推送技術的一種。
其他特點包括:
(1)建立在 TCP 協議之上,伺服器端的實現比較容易。
(2)與 HTTP 協議有著良好的相容性。預設埠也是80和443,並且握手階段採用 HTTP 協議,因此握手時不容易遮蔽,能通過各種 HTTP 代理伺服器。
(3)資料格式比較輕量,效能開銷小,通訊高效。
(4)可以傳送文字,也可以傳送二進位制資料。
(5)沒有同源限制,客戶端可以與任意伺服器通訊。
(6)協議識別符號是ws(如果加密,則為wss),伺服器網址就是 URL。
Websocket使用和 HTTP 相同的 TCP 埠,可以繞過大多數防火牆的限制。預設情況下,Websocket協議使用80埠;執行在TLS之上時,預設使用443埠。
WebSocket與HTTP的關係
相同點
- 都是一樣基於TCP的,都是可靠性傳輸協議。
- 都是應用層協議。
不同點
- WebSocket是雙向通訊協議,模擬Socket協議,可以雙向傳送或接受資訊。HTTP是單向的。
- WebSocket是需要握手進行建立連線的。
聯絡
WebSocket在建立握手時,資料是通過HTTP傳輸的。但是建立之後,在真正傳輸時候是不需要HTTP協議的。
Socket
Socket 是作業系統提供的對於傳輸層(TCP / UDP)抽象的介面,是一個程式設計概念,而 Websocket 與 HTTP 一樣是一個成文的網際網路協議。
Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
當兩臺主機通訊時,必須通過Socket連線,Socket則利用TCP/IP協議建立TCP連線。TCP連線則更依靠於底層的IP協議,IP協議的連線則依賴於鏈路層等更低層次。
webService
WebService是一種跨程式語言和跨作業系統平臺的遠端呼叫技術。
跨程式語言和跨操作平臺:就是說服務端程式採用java編寫,客戶端程式則可以採用其他程式語言編寫,反之亦然!
跨作業系統平臺:則是指服務端程式和客戶端程式可以在不同的作業系統上執行。
遠端呼叫:就是一臺計算機a上的一個程式可以呼叫到另外一臺計算機b上的一個物件的方法,譬如,銀聯提供給商場的pos刷卡系統,商場的POS機轉賬呼叫的轉賬方法的程式碼其實是跑在銀行伺服器上。再比如,amazon,天氣預報系統,淘寶網,校內網,百度等把自己的系統服務以webservice服務的形式暴露出來,讓第三方網站和程式可以呼叫這些服務功能,這樣擴充套件了自己系統的市場佔有率,往大的概念上吹,就是所謂的SOA應用。
從表面上看,WebService就是一個應用程式向外界暴露出一個能通過Web進行呼叫的API,把呼叫這個WebService的應用程式叫做客戶端,而把提供這個WebService的應用程式叫做服務端。從深層次看,WebService是建立可互操作的分散式應用程式的新平臺,是一個平臺,是一套標準。
WebService平臺需要一套協議來實現分散式應用程式的建立。任何平臺都有它的資料表示方法和型別系統。要實現互操作性,WebService平臺必須提供一套標準的型別系統,用於溝通不同平臺、程式語言和元件模型中的不同型別系統。Web service平臺必須提供一種標準來描述Web service,讓客戶可以得到足夠的資訊來呼叫這個Web service。最後,我們還必須有一種方法來對這個Web service進行遠端呼叫,這種方法實際是一種遠端過程呼叫協議(RPC)。為了達到互操作性,這種RPC協議還必須與平臺和程式語言無關。
WebService平臺技術
XML+XSD,SOAP和WSDL就是構成WebService平臺的三大技術。
XML:
WebService採用HTTP協議傳輸資料,採用XML格式封裝資料(即XML中說明呼叫遠端服務物件的哪個方法,傳遞的引數是什麼,以及服務物件的返回結果是什麼)。XML是WebService平臺中表示資料的格式。除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關的。無關性是比技術優越性更重要的:軟體廠商是不會選擇一個由競爭對手所發明的技術的。
XML解決了資料表示的問題,但它沒有定義一套標準的資料型別,更沒有說怎麼去擴充套件這套資料型別。例如,整形數到底代表什麼?16位,32位,64位?這些細節對實現互操作性很重要。XML Schema(XSD)就是專門解決這個問題的一套標準。它定義了一套標準的資料型別,並給出了一種語言來擴充套件這套資料型別。WebService平臺就是用XSD來作為其資料型別系統的。當你用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合WebService標準,所有你使用的資料型別都必須被轉換為XSD型別。你用的工具可能已經自動幫你完成了這個轉換,但你很可能會根據你的需要修改一下轉換過程。
SOAP(Simple Object Access Protocol簡單物件訪問協議):
WebService通過HTTP協議傳送請求和接收結果時,傳送的請求內容和結果內容都採用XML格式封裝,並增加了一些特定的HTTP訊息頭,以說明HTTP訊息的內容格式,這些特定的HTTP訊息頭和XML內容格式就是SOAP協議。SOAP提供了標準的RPC方法來呼叫Web Service。
SOAP協議 = HTTP協議 + XML資料格式
SOAP協議定義了SOAP訊息的格式,SOAP協議是基於HTTP協議的,SOAP也是基於XML和XSD的,XML是SOAP的資料編碼方式。打個比喻:HTTP就是普通公路,XML就是中間的綠色隔離帶和兩邊的防護欄,SOAP就是普通公路經過加隔離帶和防護欄改造過的高速公路。
WSDL:
好比我們去商店買東西,首先要知道商店裡有什麼東西可買,然後再來購買,商家的做法就是張貼廣告海報。 WebService也一樣,WebService客戶端要呼叫一個WebService服務,首先要有知道這個服務的地址在哪,以及這個服務裡有什麼方法可以呼叫,所以,WebService務器端首先要通過一個WSDL檔案來說明自己家裡有啥服務可以對外呼叫,服務是什麼(服務中有哪些方法,方法接受的引數是什麼,返回值是什麼),服務的網路地址用哪個url地址表示,服務通過什麼方式來呼叫。
WSDL(Web Services Description Language)就是這樣一個基於XML的語言,用於描述Web Service及其函式、引數和返回值。它是WebService客戶端和伺服器端都能理解的標準格式。因為是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文件,又能匯入WSDL文件,生成呼叫相應WebService的代理類程式碼。
WSDL檔案儲存在Web伺服器上,通過一個url地址就可以訪問到它。客戶端要呼叫一個WebService服務之前,要知道該服務的WSDL檔案的地址。WebService服務提供商可以通過兩種方式來暴露它的WSDL檔案地址:1.註冊到UDDI伺服器,以便被人查詢;2.直接告訴給客戶端呼叫者。