• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • HTML5 WebSocket簡介

    標簽: html

    為什么需要WebSocket
    客戶端和服務器是通過http協議完成通信交換數據的,http具有一些特點。

    • http是單向網絡協議。在連接建立后,只許客戶端向服務器端發送請求,建立連接后,服務器端才能發送數據,處于被動方。服務器端不能主動推送數據給客戶端。
    • http協議是無狀態的。http經過三次握手后才建立一次連接,在三次握手時客戶端向服務器發送連接請求中會包含 identity info(鑒別信息),每次當一個連接結束時,服務器就會將這些鑒別信息丟掉,客戶端再次發送 HTTP 請求時,就需要重新發送這些信息。

    假如我們的數據不是很頻繁的實時更新的話,http協議可以很好滿足我們的需求。但是當我們需要獲取服務器的實時數據,比如股票的實時行情、聊天室的聊天內容等,這就需要客戶端和服務器之間反復進行 HTTP 通信,客戶端不斷發送請求,去獲取當前的實時數據。常采用以下兩種方式:

    • ajax 輪詢。瀏覽器定時(隔幾秒)向服務器發送一次請求,詢問是否有新的數據,如果有就返回最新數據,瀏覽器接收到后將最新數據顯示出來。
    • Long Polling。Long Polling 的原理與 ajax 輪詢的原理差不多,都是采用輪詢的方式,它是 Polling 的一種改進。客戶端發送請求到服務器后,服務器并不立即響應客戶端,而是保持住這次連接,當有新的數據時,才返回給客戶端,客戶端接收到數據,進行展示,再立即發送一個新的請求給服務器,并重復這個過程。如果服務器的數據長期沒有更新,一段時間后,這個請求就會超時,客戶端收到超時消息后,再立即發送一個新的請求給服務器。

    以上兩種方式都是不斷的建立HTTP連接,等待服務器處理。具有以下問題。

    • ajax 輪詢。如若一段時間內服務器沒有更新的數據,客戶端仍然需要定時發送請求,服務器返回之前的老數據。此時交換沒更新的老數據,這樣既浪費了帶寬,又浪費了 CPU 的利用率。
    • Long Polling。Long Polling 雖然解決了帶寬和 CPU 利用率的問題,但是如果服務器的數據更新的過快,服務器在返回給客戶端一次數據包之后,只能等待客戶端再次發送一次請求來之后,才能發送下一個數據包給客戶端。在服務器兩次返回數據之間,需要等待客戶端接收到數據之后處理數據的時間,以及客戶端再次發送連接請求后,服務器驗證客戶端的鑒別信息,并成功建立連接的時間,在網絡擁塞的情況下,這個應該是用戶不能接受的。

    同時, 由于HTTP 協議是無狀態的,每次建立連接都需要重新傳輸 identity info(鑒別信息),這些信息不僅浪費處理時間,而且在網絡傳輸中會耗費大量的流量,往往比實際需要傳輸的數據量還要大。這樣的數據包在網絡上周期性的傳輸,對網絡帶寬也是一直浪費。

    WebSocket在此時應運而生。
    在這里插入圖片描述
    WebSocket 協議
    WebSocket 是 HTML5 新增的一種通信協議。WebSocket 協議是一種持久化的雙向通信協議,它建立在TCP之上,同 HTTP 一樣通過 TCP 來傳輸數據,但它和 HTTP有兩點不同:

    • WebSocket 是一種雙向通信協議,在建立連接后,WebSocket 服務器和客戶端都能主動的向對方發送或接收數據,就像 Socket 一樣,不同的是 WebSocket 是一種建立在 Web 基礎上的一種簡單模擬 Socket 的協議。
    • WebSocket 需要通過握手連接,類似于 TCP 它也需要客戶端和服務器端進行握手連接,連接成功后才能相互通信。

    WebSocket 工作流程
    為了建立一個 WebSocket 連接,客戶端瀏覽器首先要向服務器發起一個 HTTP 請求,這個請求和通常的 HTTP 請求不同,包含了一些附加頭信息,其中附加頭信息 “Upgrade: WebSocket” 表明這是一個申請協議升級的 HTTP 請求,服務器端解析這些附加的頭信息然后產生應答信息返回給客戶端,客戶端和服務器端的 WebSocket 連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,并且這個連接會持續存在直到客戶端或者服務器端的某一方主動的關閉連接。
    下面是一個典型的 WebSocket 發送請求和響應請求的例子:
    瀏覽器向服務器發起 WebSocket 請求:
    在這里插入圖片描述
    這個請求與普通的 HTTP 請求有一些區別

    Upgrade: websocket
    Connection: Upgrade
    

    表示請求的目的就是要將客戶端和服務器端的通訊協議從 HTTP 協議升級到 WebSocket 協議

    Sec-WebSocket-Key:
    Sec-WebSocket-Extensions:
    Sec-WebSocket-Version:
    

    客戶端瀏覽器需要向服務器端提供的握手信息,服務器端解析這些頭信息。Sec-WebSocket-Key 是一個 Base64 encode的值,這個是瀏覽器隨機生成的,Sec-WebSocket-Version 是告訴服務器所使用的 Websocket Draft(協議版本)
    服務器返回:
    服務器端返回以下信息,以表明服務器端獲取了客戶端的請求,同意創建 WebSocket 連接。
    在這里插入圖片描述
    告訴客戶端即將升級的是Websocket協議

    Upgrade: websocket
    Connection: Upgrade
    

    這個則是經過服務器確認,并且加密過后的 Sec-WebSocket-Key。

    Sec-WebSocket-Accept
    

    WebSocket demo
    index.html

     // 打開一個 web socket  這里端口號和上面監聽的需一致
            var ws = new WebSocket('ws://localhost:3000/');
    
            ws.addEventListener('open', function() {
                // Web Socket 已連接上,使用 send() 方法發送數據
                setInterval(function() {
                    ws.send('客戶端消息');
                },2000);
            });
    
            // 這里接受服務器端發過來的消息
            ws.addEventListener('message', function(e) {
                console.log(e.data)
            });
    

    在這里插入圖片描述
    app.js

    var ws = require('nodejs-websocket');
    var server = ws.createServer(function(socket){
    // 事件名稱為text(讀取字符串時,就叫做text),讀取客戶端傳來的字符串
       var count = 1;
        socket.on('text', function(str) {
           // 在控制臺輸出前端傳來的消息  
            console.log(str);
            //向前端回復消息
            socket.sendText('服務器端收到客戶端端發來的消息了!' + count++);
        });
    }).listen(3000); 
    

    在這里插入圖片描述

    WebSocket api
    可以看MDN上關于WebSocket的api.
    創建WebSocket

    var Socket = new WebSocket(url, [protocol] );
    

    假定我們使用了以上代碼創建了 Socket 對象

    WebSocket 屬性

    • Socket.readyState 只讀屬性 readyState 表示連接狀態,可以是以下值:
      0 - 表示連接尚未建立。
      1 - 表示連接已建立,可以進行通信。
      2 - 表示連接正在進行關閉。
      3 - 表示連接已經關閉或者連接不能打開。
    • Socket.bufferedAmount.只讀屬性 bufferedAmount 已被 send() 放入正在隊列中等待傳輸,但是還沒有發出的 UTF-8 文本字節數。

    WebSocket 事件

    • open 連接建立時觸發
    • message 客戶端接收服務端數據時觸發
    • error 通信發生錯誤時觸發
    • close 連接關閉時觸發

    WebSocket 方法

    • Socket.send() 使用連接發送數據
    • Socket.close() 關閉連接
    版權聲明:本文為juzipchy原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/juzipchy/article/details/104557699

    智能推薦

    HTML5 WebSocket DEMO示例

    1.使用Eclipse+Tomcat8環境進行演示 2.創建一個Servlet用于接收客戶端的請求數據,并進行處理 3.在HTML5 頁面中使用WebSocket與服務器端進行交互 4.項目組織結構 5.運行測試結果...

    HTML5 WebSocket長連接

    HTML5 WebSocket實現長連接 先介紹一下WebSocket WebSocket的概念 WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。 WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,并...

    Html5 websocket使用案例

    HTTP通訊   WebSocket  protocol 是HTML5一種新的協議,它實現了瀏覽器與服務器全雙工通信(full-duple)。一開始的握手需要借助HTTP請求完成。 https://www.runoob.com/html/html5-websocket.html WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在...

    HTML5簡介與標簽變化

    HTML5在2014年就定稿了!! HTML5≈html+css+javascript+api DOCTYPE聲明 定義和用法 – 1、必須在html文檔的第一行 2、html:5按下tab鍵/!+ctrl+e—>生成html5的標準形式 3、不是html的標簽 HTML5標簽變化 DTD – 文檔類型定義 1、DTD:可定義合法的xml文檔構...

    猜你喜歡

    html5簡介及常用標簽

    HTML介紹 Web服務本質 chrome瀏覽器訪問127.0.0.1:9008 PyCharm里查看自制服務器socket通信端 讓服務器響應數據給瀏覽器 刷新瀏覽器 流程: 瀏覽器發請求 --> HTTP協議 --> 服務端接收請求 --> 服務端返回響應 --> 服務端把HTML文件內容發給瀏覽器 --> 瀏覽器渲染頁面 HTML是什么? 超文本標記語言(Hyp...

    html5 新特性簡介

    一、W3C對HTML5的需求整體原則: 新特性應該基于 HTML、CSS、DOM 以及 JavaScript。 減少對外部插件的需求(比如 Flash) 更優秀的錯誤處理 更多取代腳本的標記 HTML5 應該獨立于設備 開發進程應對公眾透明 二、什么是HTML: HTML是創建網頁的標準標記語言 HTML描述了使用標記的網頁結構 HTML元素由標簽顯示 瀏覽器不會顯示HTML標簽,而是使用它們呈現...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    精品国产乱码久久久久久蜜桃不卡