什么是JavaScript中的服務器發送事件?含代碼

    什么是JavaScript中的服務器發送事件?

    在 Web 應用程序開發中,經常需要將服務器上的數據實時顯示在客戶端上。愛掏網 - it200.com以往的做法是輪詢,在客戶端不斷地向服務器發送請求,服務器返回數據,這樣會占用大量的帶寬和服務器資源。愛掏網 - it200.com然而,現在有一個更好的解決方案——服務器發送事件(Server-Sent Events,簡稱 SSE)。愛掏網 - it200.com

    服務器發送事件(SSE)機制是一種基于HTTP協議的服務器推送技術。愛掏網 - it200.com它允許服務器向客戶端推送任意數量的消息,從而能夠實現服務器主動推送數據到客戶端的效果。愛掏網 - it200.comSSE 常用于實時性要求較高的應用場景,如股票交易、拍賣等,通常被認為是 WebSocket 技術的一種替代方案,使用 SSE 比使用 WebSocket 更加輕量級。愛掏網 - it200.com

    SSE 與 WebSocket 不同,SSE 采用的是單向通信的方式。愛掏網 - it200.com當客戶端向指定的 URL 發送一個 SSE 請求時,瀏覽器會在建立連接之后一直等待直到服務器發送一條消息為止。愛掏網 - it200.com這種方式避免了 WebSocket 的雙向通信所引發的一些安全問題,并且不需要額外的握手流程,可以快速地建立連接和傳輸數據。愛掏網 - it200.com

    使用 SSE 需要借助一個新的瀏覽器 API:EventSource,它定義了與服務器建立 SSE 連接的方法。愛掏網 - it200.com

    要建立 SSE 連接,只需要在客戶端代碼中創建一個 EventSource 對象,然后調用它的 open 方法,傳入一個服務器地址作為參數:

    const source = new EventSource('/sse')
    

    如果服務器設置了 CORS(跨域資源共享)響應頭,那么需要將 EventSource 構造函數的第一個參數設置為完整的 URL 。愛掏網 - it200.com在服務器端,需要監聽請求的 URL,并向客戶端發送 SSE 事件。愛掏網 - it200.com下面是一個簡單的 Node.js 例子,監聽 /sse 路徑的 GET 請求,并且每秒鐘向客戶端推送一條消息:

    const http = require('http')
    
    const server = http.createServer((req, res) => {
      if (req.url === '/sse') {
        res.writeHead(200, {
          'Content-Type': 'text/event-stream',
          'Cache-Control': 'no-cache',
          'Connection': 'keep-alive'
        })
        let id = 0
        setInterval(() => {
          res.write(`id: {id}\n`)
          res.write(`data:{new Date().toISOString()}\n\n`)
          id++
        }, 1000)
      } else {
        res.writeHead(404)
        res.end()
      }
    })
    
    server.listen(3000, () => {
      console.log('Server is listening on http://localhost:3000')
    })
    

    上面的代碼使用了 setInterval 方法每秒鐘向客戶端推送一條消息,由于 SSE 是單向通信,因此只需要將消息以特定格式發送給客戶端即可。愛掏網 - it200.com

    在客戶端,可以監聽 EventSource 對象的 message 事件,當服務器向客戶端發送消息時,會觸發該事件:

    source.onmessage = event => {
      console.log(event.data)
    }
    

    event.data 屬性包含服務器發送的數據。愛掏網 - it200.comSSE 支持多種類型的消息,例如:普通文本、JSON、HTML 等。愛掏網 - it200.com

    當客戶端與服務器的 SSE 連接發生錯誤時,會觸發 EventSource 對象的 error 事件。愛掏網 - it200.com通過該事件的 event.target.readyState 屬性可以獲取當前連接的狀態:

    • 0 :連接已經關閉。愛掏網 - it200.com
    • 1 :正在連接。愛掏網 - it200.com
    • 2 :已經建立連接,可以接收服務器發送的數據。愛掏網 - it200.com

    XMLHttpRequest 對象不同,EventSource對象支持重連機制,當連接斷開時,瀏覽器會自動發起新的連接請求。愛掏網 - it200.com可以通過 EventSource.retry 屬性來控制重連策略,例如:

    const source = new EventSource('/sse')
    source.retry = 3000 // 每隔 3 秒嘗試重新連接一次
    

    SSE 的優點

    相對于輪詢、Comet 等技術,SSE 有以下幾點優點:

    • 省去了客戶端不斷向服務器發送請求的過程,減少帶寬和服務器資源的損耗。愛掏網 - it200.com
    • SSE 與 WebSocket 相比,SSE 協議更加輕量級。愛掏網 - it200.com不需要進行復雜的握手流程,可以快速建立連接和傳輸數據。愛掏網 - it200.com
    • SSE 可以支持自定義事件、重連機制、超時機制等豐富的特性。愛掏網 - it200.com
    • SSE 提供了對跨域請求的支持,可以安全地將信息發送給任何站點,而不必擔心安全問題。愛掏網 - it200.com

    SSE 的缺點

    盡管 SSE 提供了一種實時推送數據的便捷方式,但是它的缺點也是存在的:

    • SSE 采用的單向通信方式,只能從服務器向客戶端發送數據,不支持雙向通信。愛掏網 - it200.com
    • SSE 的兼容性在一定程度上依賴于瀏覽器。愛掏網 - it200.com雖然現代瀏覽器基本上都支持 SSE,但是特定的瀏覽器和版本可能不支持 SSE。愛掏網 - it200.com

    結論

    SSE 是一種比較新的服務器推送技術,與傳統的輪詢方式相比,SSE 更加高效,并且可以實現實時推送數據的需求。愛掏網 - it200.com相對于 WebSocket 技術而言,SSE 的協議更加輕量級,適用于一些不需要復雜的雙向通信的應用場景。愛掏網 - it200.com雖然 SSE 的兼容性存在一定問題,但是該技術在開發實時應用時還是值得考慮的。愛掏網 - it200.com

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 亚洲va乱码一区二区三区| 日韩aⅴ人妻无码一区二区| 精品一区二区三区在线观看l| 精品一区二区91| 国产suv精品一区二区6| 国产精品区一区二区三在线播放| 免费无码VA一区二区三区| 亚洲av无一区二区三区| 日韩视频一区二区三区| 乱码人妻一区二区三区| 久久一区二区明星换脸| 无码人妻精品一区二| 国产香蕉一区二区精品视频| 精品视频在线观看你懂的一区| 在线观看中文字幕一区| 无码人妻精品一区二区三区99性| 无码国产精品一区二区免费式芒果| 精品成人av一区二区三区| 影院无码人妻精品一区二区| 国产在线精品一区二区在线看| 无码中文字幕一区二区三区| 少妇特黄A一区二区三区| 成人精品一区二区三区不卡免费看| 麻豆视频一区二区三区| 另类ts人妖一区二区三区| 乱码人妻一区二区三区| 中文字幕一区二区三区精彩视频| 日本不卡免费新一区二区三区| 成人精品视频一区二区三区| aⅴ一区二区三区无卡无码| 国产成人av一区二区三区不卡| 狠狠色综合一区二区| 亚洲日本va一区二区三区| 欧美人妻一区黄a片| 日本精品一区二区在线播放| 无码国产亚洲日韩国精品视频一区二区三区 | 日本精品视频一区二区| 无码视频一区二区三区| 国产精品一区二区香蕉| 精品视频在线观看一区二区三区| 国产福利一区视频|