java?常規(guī)輪詢長輪詢Long?polling實現(xiàn)示例詳解
正文
長輪詢是與服務器保持持久連接的最簡單的方式,它不使用任何特定的協(xié)議,例如 WebSocket 或者 Server Sent Event。
它很容易實現(xiàn),在很多場景下也很好用。
常規(guī)輪詢
從服務器獲取新信息的最簡單的方式是定期輪詢。也就是說,定期向服務器發(fā)出請求:“你好,我在這兒,你有關于我的任何信息嗎?”例如,每 10 秒一次。
作為響應,服務器首先通知自己,客戶端處于在線狀態(tài),然后 —— 發(fā)送目前為止的消息包。
這可行,但是也有些缺點:
- 消息傳遞的延遲最多為 10 秒(兩個請求之間)。
- 即使沒有消息,服務器也會每隔 10 秒被請求轟炸一次,即使用戶切換到其他地方或者處于休眠狀態(tài),也是如此。就性能而言,這是一個很大的負擔。
因此,如果我們討論的是一個非常小的服務,那么這種方式可能可行,但總的來說,它需要改進。
長輪詢
所謂“長輪詢”是輪詢服務器的一種更好的方式。
它也很容易實現(xiàn),并且可以無延遲地傳遞消息。
其流程為:
- 請求發(fā)送到服務器。
- 服務器在有消息之前不會關閉連接。
- 當消息出現(xiàn)時 —— 服務器將對其請求作出響應。
- 瀏覽器立即發(fā)出一個新的請求。
對于此方法,瀏覽器發(fā)出一個請求并與服務器之間建立起一個掛起的(pending)連接的情況是標準的。僅在有消息被傳遞時,才會重新建立連接。
如果連接丟失,可能是因為網絡錯誤,瀏覽器會立即發(fā)送一個新請求。
實現(xiàn)長輪詢的客戶端 subscribe
函數(shù)的示例代碼:
async function subscribe() { let response = await fetch("/subscribe"); if (response.status == 502) { // 狀態(tài) 502 是連接超時錯誤, // 連接掛起時間過長時可能會發(fā)生, // 遠程服務器或代理會關閉它 // 讓我們重新連接 await subscribe(); } else if (response.status != 200) { // 一個 error —— 讓我們顯示它 showMessage(response.statusText); // 一秒后重新連接 await new Promise(resolve => setTimeout(resolve, 1000)); await subscribe(); } else { // 獲取并顯示消息 let message = await response.text(); showMessage(message); // 再次調用 subscribe() 以獲取下一條消息 await subscribe(); } } subscribe();
正如你所看到的,subscribe
函數(shù)發(fā)起了一個 fetch
,然后等待響應,處理它,并再次調用自身。
服務器應該可以處理許多掛起的連接
服務器架構必須能夠處理許多掛起的連接。
某些服務器架構是每個連接對應一個進程,導致進程數(shù)和連接數(shù)一樣多,而每個進程都會消耗相當多的內存。因此,過多的連接會消耗掉全部內存。
使用像 PHP 和 Ruby 語言編寫的后端程序會經常遇到這個問題。
使用 Node.js 編寫的服務端程序通常不會出現(xiàn)此類問題。
也就是說,這不是編程語言的問題。大多數(shù)現(xiàn)代編程語言,包括 PHP 和 Ruby,都允許實現(xiàn)更適當?shù)暮蠖顺绦颉V皇钦埓_保你的服務器架構在同時有很多連接的情況下能夠正常工作。
以上就是java 常規(guī)輪詢長輪詢Long polling實現(xiàn)示例詳解的詳細內容,更多關于java 常規(guī)輪詢長輪詢的資料請關注腳本之家其它相關文章!
相關文章
java input 調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法
今天小編就為大家分享一篇java input 實現(xiàn)調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08利用Java工具類Hutool實現(xiàn)驗證碼校驗功能
這篇文章主要介紹了利用Java工具類Hutool實現(xiàn)驗證碼校驗功能,利用Hutool實現(xiàn)驗證碼校驗,校驗的Servlet與今天的第一篇是一樣的,唯一就是驗證碼的生成是不一樣的,利用Hutool生成驗證碼更快捷.需要的朋友可以參考下2022-10-10SpringCloud容器化服務發(fā)現(xiàn)及注冊實現(xiàn)方法解析
這篇文章主要介紹了SpringCloud容器化服務發(fā)現(xiàn)及注冊實現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08SpringCloud大文件分片斷點上傳實現(xiàn)原理
這篇文章主要介紹了SpringCloud大文件分片斷點上傳實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05