Ajax(Asynchronous Javascript and XML)
早期的瀏覽器在向web服務(wù)請求時,每請求一次,需要更新加載reload整個頁面,這是非常耗時的事情。為了解決這個問題,Ajax誕生了,通過Ajax可以實現(xiàn)瀏覽器請求web資源,僅僅只需要更新需要更新的部分而不用重新加載整個頁面,這大大節(jié)約了資源和時間。
XHR(XML HTTP Request)
通過Ajax發(fā)送的請求,都是XHR請求,他是瀏覽器層面的API技術(shù),可以通過他實現(xiàn)數(shù)據(jù)傳輸。XHR早期版本的能力有限,只能傳輸文本,處理上傳能力有限,并且不能處理跨域請求。XHR經(jīng)過了兩次更新,現(xiàn)在處于level2階段,目前已經(jīng)支持:請求超時;傳輸二進制和文本數(shù)據(jù);應(yīng)用重寫媒體類型和編碼響應(yīng);監(jiān)控請求的進度和事件;有效文件上傳;安全的跨來源請求等。所有的現(xiàn)代瀏覽器都支持XHR level2的功能。
Websocket
計算機交流協(xié)議,提供雙通道通訊,即可以在一個tcp連接上同時進行request、response操作。Websocket被我們稱之為長連接,相比于Ajax的XHR技術(shù),我們稱之為短連接。在使用Websocket的時候,tcp連接一旦建立,就不會中斷(除非我們主動斷開連接),我們在該tcp連接上進行websocket通信,向服務(wù)器請求消息。Ajax短連接意思就是,每一個XHR請求,都會建立一次tcp連接,直到一次請求響應(yīng)結(jié)束或超時,tcp連接就會斷開。所以,XHR請求中,每請求一次都需要建立一次tcp連接,相當(dāng)耗費資源。但對于傳統(tǒng)的web應(yīng)用,用戶操作一個按鈕進行一次請求數(shù)據(jù)更新的操作很常見,并且頻率也不會很高,所以基本上不太影響性能。websocket不單單只是連接服務(wù)器與客戶端,還可以連接客戶端與客戶端或者客戶端與其他資源等,例如:聊天室的時時輸入同步功能,如甲,乙,丙三個用戶在一個聊天室進行聊天,甲輸入時,可以在乙和丙的客戶端同步到甲正在輸入的提示信息,其他信息以此類推。這些功能都由websocket技術(shù)實現(xiàn),傳統(tǒng)的XHR技術(shù)不支持。
服務(wù)器推送
服務(wù)器主動向客戶端推送消息,而不需要客戶端主動請求。Ajax和websokcet都可以實現(xiàn)該功能,只是策略有所不同。Ajax實現(xiàn)服務(wù)器推送使用輪詢polling,即定期定時向服務(wù)器發(fā)送更新請求,可能是每秒發(fā)送也可能是幾分鐘發(fā)送一次,這個需要根據(jù)更新消息的頻率和需求而定。但是如果是頻率較高的請求,從某種成都來說也是比較耗費資源的。于是還有另外一種輪詢機制,即所謂的長輪詢long polling,發(fā)送一個request請求建立連接,直到服務(wù)器有更新才返回響應(yīng)。在長輪詢過程中可能會遇到請求超時,連接斷開的情況,這時我們需要設(shè)置一個斷開重連機制即可。大致總結(jié)一下Ajax實現(xiàn)服務(wù)器推送有兩種方法:
1. 短輪詢:定時定期向服務(wù)器發(fā)送更新請求
2. 長輪詢(comet):發(fā)送一個更新請求,直到服務(wù)器有更新數(shù)據(jù)為止返回請求,連接斷開。在此過程中,如果服務(wù)器長時間無更新造成請求斷開連接,可以再次發(fā)送請求建立連接
websocket推送技術(shù)在H5才得以運用,只建立一次連接,就可以保持服務(wù)端與客戶端之間的通訊,客戶端不需要向服務(wù)器做額外的請求,服務(wù)器隨時可以給建立連接的客戶端發(fā)送推送請求。
Ajax vs. Websocket
1. Ajax短連接,Websocket長連接
2. Ajax單向傳輸,一發(fā)一收。Websocket雙向傳輸,同時在一個tcp連接上進行request、response操作
3. Ajax不支持stream流數(shù)據(jù)傳輸,在傳輸大文件時,blob類型大文件對象可以進行分塊發(fā)送,一個塊最大可以分64M。Websocket支持stream流數(shù)據(jù)傳輸,可以傳輸blob對象大文件,也可以之間傳輸stream流
4. Ajax輕量級,Websocket因為長連接的特性,比較消耗資源(比如:移動端造成耗電等)