藉助node實戰WebSocket

来源:http://www.cnblogs.com/giggle/archive/2016/05/18/5499794.html
-Advertisement-
Play Games

WebSocket協議,是建立在TCP協議上的,而非HTTP協議。 如下: ws://127.0.0.1或wss://127.0.0.1就是WebSocket請求。 註:ws表示WebSocket協議,wss表示加密的WebSocket協議。 WebSocket的好處就是允許伺服器和客服端進行實時地 ...


一、WebSocket概述

WebSocket協議,是建立在TCP協議上的,而非HTTP協議。

如下:

ws://127.0.0.1或wss://127.0.0.1就是WebSocket請求。

註:ws表示WebSocket協議,wss表示加密的WebSocket協議。

WebSocket的好處就是允許伺服器和客服端進行實時地互相通信,而不像Ajax那樣,只能由客服端發起請求,並且WebSocket不受同源策略限制,這恰恰是Ajax的軟肋。

好了,初步瞭解WebSocket後,我們就一起一步步探究實現一個Demo吧。

二、客服端之旅

因為是基於WebSocket嘛,那在客服端,首先,得發起一個WebSocket請求。

如下:

<!DOCTYPE html>
    <head>
        <title>WebSocket</title>
    </head>
    <body>
        <script>
            //創建WebSocket對象請求
            var socket = new WebSocket('ws://127.0.0.1:8080/');
        </script>    
    </body>
</html>
EntireCode

其次,採用回調函數監聽相應事件,並處理。監聽事件一共四個:

  1、  onpen :請求成功時,觸發

  2、  onclose :請求關閉時,觸發

  3、  onerror :請求或連接期間出錯時,觸發

  4、  onMessage :接收伺服器發送來的消息時,觸發

另,當發送請求時,創建的WebSocket 實例,有個狀態值readyState:

  1、  0 : 代表還沒連接或正在連接;

  2、  1 : 代表連接成功;

  3、  2 : 代表正在關閉連接;

  4、  3 : 代表連接關閉。

我們在該demo中加入這四個監聽事件。

如下:

<!DOCTYPE html>
    <head>
        <title>WebSocket</title>
    </head>
    <body>
        <script>
            //創建WebSocket對象請求
            var socket = new WebSocket('ws://127.0.0.1:8080/');
            //相應監聽事件
            socket.onopen = onOpen;
            socket.onclose = onClose;
            socket.onerror = onError;
            socket.onmessage = onMessage;
        </script>    
    </body>
</html>
EntireCode

在這監聽事件中,你可以按照你的意願添加觸發函數。

如下:

<!DOCTYPE html>
    <head>
        <title>WebSocket</title>
    </head>
    <body>
        <script>
            var onOpen = function(event){
                console.log('Socket opened. readyState:'+socket.readyState);
                var msg = {
                    type: "message",
                    text: "something",
                    id: "number",
                    time: Date.now()
                };
                //send可以向後臺發送字元串、Blob或ArrayBuffer,固傳入對象時,利用JSON對其序列化
                socket.send(JSON.stringify(msg));
            };
            var onClose = function(event){
                console.log('Socket closed.readyState:'+socket.readyState);
                console.log('Connected to: ' + event.currentTarget.url);
            };
            var onMessage = function(data){
                console.log("We get signal:");
                console.log(data);
                console.log('onMessageready: ' + socket.readyState);
            };
            var onError = function(event){
                console.log("We got an error.: " + event.data);
            };
            var socket = new WebSocket('ws://127.0.0.1:8080/');
            socket.onopen = onOpen;
            socket.onclose = onClose;
            socket.onerror = onError;
            socket.onmessage = onMessage;
        </script>    
    </body>
</html>
EntireCode 
三、node創建伺服器

藉助於node創建一個簡易的伺服器,以便看清整個WebSocket的流程。

因為是WebSocket協議,所以在node中你需要引入ws模塊,假設我們監聽的埠號為8080。

如下:

//需要ws模塊
var WebSocketServer = require('ws').Server;
//並創建wss伺服器
var wss = new WebSocketServer({port: 8080});
EntireCode

接著,我們需要在連接成功後,我們可以向客服端發送一點點東西,如’hello world’,以及監聽客服端發送信息來時的事件message。

如下:

 

//需要ws模塊
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({port: 8080});
wss.on('connection', function(ws){
    ws.on('message', function(message){
        var obj = JSON.parse(message);
        console.log('received: %s', obj.time);
    });
    ws.send('hello world');
});
console.log('running!!');
EntireCode
四、運行

前提:因為引入了ws模塊,所以需要引入ws模塊:npm install ws

首先,運行node搭建的簡易伺服器(我將其存儲在D:WebSocket/server.js)。

如下:

 

接著,運行客服端代碼,打開chrome調試器得下:

 

再看看剛纔的node環境,得下:

固,它們已經可以互相通信了。

我們再打開chrome調試器,具體看看WebSocket請求,如下:

 

在RequestHeaders,”Connection:Upgrade”表示瀏覽器通知伺服器,如果可以就升級為websocket協議。Origin用於驗證瀏覽器功能變數名稱是否在伺服器許可範圍內。Sec-WebSocket-Key則用於握手協議密鑰,是base64編碼的16位元組隨機字元串。Upgrade頭信息表示將通信協議從HTTP/1.1轉向該項所指定的協議。

在ResponseHeaders,”Connection:Upgrade”通知瀏覽器,需要改變協議。Sec-WebSocket-Accept是伺服器在瀏覽器提供的Sec-WebSocket-Key字元串後面,添加“258EAFA5-E914-47DA-95CA-C5AB0DC85B11” 字元串,然後再取sha-1的hash值。瀏覽器將對這個值進行驗證,以證明確實是目標伺服器回應了webSocket請求。

五、拓展閱讀

[1]  阮一峰,WebSocket

[2]  Divid Walsh,WebSocket and Socket.IO 

[3]  socket.io

[4]  Writing WebSocket client applications

[5]  WebSockets:A Guide

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 新博客 "wossoneri.com" " 設計模式系列目錄 " 需求情景 比如現在需要做一個收銀軟體,要根據用戶所買商品的單價和數量進行計算。 很簡單,用“單價 數量”即可。 但如果某天需要打折呢? 也很簡單,同一個方法,把折扣作為一個參數,預設值為1,代碼改為“單價 數量 折扣”即可。 恩,看起 ...
  • 概述 有時候你可能會在條件判斷中,根據不同的對象類型(通常是基類的一系列子類,或介面的一系列實現),提供相應的邏輯和演算法。當出現大量類型檢查和判斷時,if else(或switch)語句的體積會比較臃腫,這無疑降低了代碼的可讀性。另外,if else(或switch)本身就是一個“變化點”,當需要擴... ...
  • 生成器模式 封裝一個產品的構造過程,並允許按步驟構造。 將一個複雜對象的構建與表示分離,使同樣的構造過程可以創建不同的表示。 生成器模式結構中的四種角色: 產品(Product): 所要構建的複雜對象。 抽象生成器(Builder): 抽象生成器是一個介面,該介面除了為創建一個Product對象的各 ...
  • 適配器模式 適配器模式 將一個類的介面轉換成客戶期望的另一個介面,適配器讓原本介面不相容的類可以合作無間。 通過創建適配器進行介面轉換,讓不相容的介面變成相容。這可以讓客戶從實現的介面解耦。如果在一段時間後,想要改變介面,適配器可以將改變的部分封裝起來,客戶就不必為了應對不同的介面 而每次跟著修改。 ...
  • 狀態模式 允許對象在內部狀態改變時改變它的行為,對象看起來好像修改了它的類。 狀態模式所涉及到的角色有: 環境(Context)角色,也成上下文:定義客戶端所感興趣的介面,並且保留一個具體狀態類的實例。這個具體狀態類的實例給出此環境對象的現有狀態。 抽象狀態(State)角色:定義一個介面,用以封裝 ...
  • 觀察者模式 定義了對象之間的一對多依賴,這樣一來,當一個對象狀態改變時,它的所有依賴者都會收到通知並自動更新。 觀察者模式中,分為推和拉兩種模式。 推模式,即主題對象向觀察者對象推送狀態值,不管觀察者對象是否需要,並且推送全部數據或者部分數據。 拉模式,即主題對象通知觀察者對象狀態值已改變,觀察者根 ...
  • 策略模式 定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。 說明: 1、可以動態地改變對象的行為; 2、各個策略演算法的平等性,各個策略演算法在實現上是相互獨立的,相互之間沒有任何依賴的(由此,策略模式也可以描述為“策略演算法是相同行為的不同實現”); 3、在運 ...
  • 裝飾者模式 動態的將責任附加到對象上。若要擴展功能,裝飾者模式提供了比繼承更有彈性的替代方案。 說明: 1、裝飾者和被裝飾者對象有相同的超類型; 2、可以用一個或者多個裝飾者包裝一個對象; 3、既然裝飾者和被裝飾者對象有相同的超類型,所以在任何需要原始對象(被裝飾者)的場合,可以用裝飾過的對象代替它 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...