謝謝邀請~
這個問題,看似簡單,但是感覺題主又不是那個簡單的意思(可能我想多了)。如果問【前端怎么和后端交互】,我覺得大部分程序員都能回答上來,但如果是【后端怎么(主動)和前端交互】,估計會難倒很多程序員了。
先看一個場景
我之前做過一個小項目,只有一個頁面,展示的是各個分公司當天的業績,就是掙了多少錢。后臺服務是Java,數據庫是Mysql,有一張匯總表,內容大概是北京-100萬,上海-80萬這樣的。
流程很簡單,HTML頁面發起請求到Java,Java訪問數據庫查詢數據,再返回給HTML展示。但是Mysql中的匯總表的數據,是不定期更新的,可能10分鐘,可能20分鐘。
最簡單的做法是什么?
HTML中用JS設置一個定時輪詢(Polling),每隔幾秒去發起一次請求,獲取最新的數據,如果數據沒有變化,頁面也保持變化。
缺點很明顯,前端發起的很多請求都是無效的(因為數據沒有變化),那有沒有辦法當后臺數據發生變化時,Java可以主動通知瀏覽器呢?
WebSocket
向大家介紹一下WebSocket。
WebSocket是一個基于TCP的協議,它可以使前端和服務器的數據交互變得更簡單,前端和服務器只需要完成一次握手,就可以創建持久性的連接,并可以完成雙向的數據傳輸,注意這里的雙向,也就是服務端可以主動通知前端;WebSocket的數據格式輕量,所以性能很高;與http協議也有著良好的兼容性。
回到上面的場景,可以這么改造:
HTML頁面與Java服務端建立WebSocket連接,然后就不再主動發起請求,Java服務端定時查詢數據庫,當數據有變化時,通知前端。
可能有人會問,這不就是把HTML頁面的輪詢,移到Java端了么?
但是想象一下,如果有100個客戶端打開了這個HTML頁面呢?那就意味著100個前端的定時輪詢,變成了1個Java服務端的定時輪詢。