【flask-socektio】
之前不知道在哪個場合下提到過如何從web后臺向前臺推送消息。聽聞了反向ajax技術這種模式之后,大呼神奇,試了一下之后發現也確實可以用。不過,反向ajax的代價也很明顯,只要客戶端還和服務端要有信息交互,服務端就必須還維持客戶端的這個請求,然后在合適的時候返回。當客戶端一多,這么做的成本會比較大。
其他的后端推前端的技術還有類似于隱藏frame,Comet、長輪詢等等,沒有詳細了解過,總之也是各有千秋但也各有利弊。
前不久在開發中碰到了這樣一個場景,就是在后臺執行一些代碼,然后會根據執行的最新情況推送一些提示信息到前臺讓用戶可以知道目前執行到哪一步了。典型就是一個后臺向前端推送消息的,而且是比較簡單的一個場景。用反向ajax的話好像略顯累贅,因為消息的頻度還是蠻高的,應該會消費不少網絡資源,而且ajax請求的url后執行的程序肯定和后臺的工作程序是并行的,如果要獲得工作程序的進度信息可能還會涉及到進程間通信問題,總之各種麻煩。最好能找到一種解決方案,可以在后臺隨時推送數據后在前臺實時展示并且允許后臺程序繼續跑的。
然后找了下就找到了websocket這種html5之后才有的技術。另外再找了下發現了flask-socketio這個拓展模塊添加了flask對websocket的支持。
概述
websocket是html5中實現了服務端和客戶端進行雙向文本或二進制數據通信的一種新協議,其實已經低于HTTP協議本身和HTTP本質上沒有什么關系了。不過形式上兩者還是有想象之處。因此websocket的連接地址是長這樣的:ws://localhost:8080??梢钥吹剑瑓f議修飾符不是http了。
另外,websocket在連接建立階段是通過HTTP的握手方式進行的,這可以看做是為了兼容瀏覽器或者使用一些現成的功能來實現,這樣一種捷徑。當連接建立之后,客戶端和服務端之間就不再進行HTTP通信了,所有信息交互都由websocket接管。
從資源占用的角度上來說,其實websocket比ajax占用的資源更多,但它真正實現了全雙工通信這一點還是很理想的,意味著無論是前端還是后臺的信息交互程序編寫都會變得更加方便。由于采用了新的協議,所以我們也需要適當地改造下前后臺的程序。
前端ws編寫以及socket.io.js
由于是比較新的東西,并不一定所有的瀏覽器都支持,所有可以用:
if ('WebSocket' in window){ websocket = new WebSocket('ws://localhost:8080');}
這樣的方式來判斷是否支持,只有支持的情況下才開始websocket處理
其實光實現雙向通信是并沒有什么用的,主要還是在通信過程中,讓前后端發生一些動作,這就需要添加監聽事件。在前端這里,我們可以給websocket這個對象的一些監聽回調接口賦值,來規定在不同的場合下前端做些不同的事情。比如:
新聞熱點
疑難解答