websocket簡單入門

来源:https://www.cnblogs.com/lawliet-y/archive/2018/03/03/8496273.html
-Advertisement-
Play Games

今天說起及時通信的時候,突然被問到時用推的方式,還是定時接受的方式,由於之前頁面都是用傳統的ajax處理,可能對ajax的定時獲取根深蒂固了,所以一時之間沒有相同怎麼會出現推的方式呢?當被提及websocket的時候突然頭腦中搭上了這根線。一、WebSocket是HTML5出的東西(協議),也就是說 ...


今天說起及時通信的時候,突然被問到時用推的方式,還是定時接受的方式,由於之前頁面都是用傳統的ajax處理,可能對ajax的定時獲取根深蒂固了,所以一時之間沒有相同怎麼會出現推的方式呢?
當被提及websocket的時候突然頭腦中搭上了這根線。
一、WebSocket是HTML5出的東西(協議),也就是說HTTP協議沒有變化,或者說沒關係,但HTTP是不支持持久連接的(長連接,迴圈連接的不算)
首先HTTP有1.1和1.0之說,也就是所謂的keep-alive,把多個HTTP請求合併為一個,但是Websocket其實是一個新協議,跟HTTP協議基本沒有關係,只是為了相容現有瀏覽器的握手規範而已,也就是說websockt和http有交集,但是並不是全部。
另外Html5是指的一系列新的API,或者說新規範,新技術。Http協議本身只有1.0和1.1,而且跟Html本身沒有直接關係。。通俗來說,你可以用HTTP協議傳輸非Html數據,就是這樣=。=是不同層次的東西。

二、websocket的特點
寫在別的特點之前,最重要的:是可以從伺服器向客戶端進行消息的推送。
(1)建立在 TCP 協議之上,伺服器端的實現比較容易。
(2)與 HTTP 協議有著良好的相容性。預設埠也是80和443,並且握手階段採用 HTTP 協議,因此握手時不容易屏蔽,能通過各種 HTTP 代理伺服器。
(3)數據格式比較輕量,性能開銷小,通信高效。
(4)可以發送文本,也可以發送二進位數據。
(5)沒有同源限制,客戶端可以與任意伺服器通信。
(6)協議標識符是ws(如果加密,則為wss),伺服器網址就是 URL。

三、websocket簡單API
1.構造函數
WebSocket 對象作為一個構造函數,用於新建 WebSocket 實例。
var ws = new WebSocket('ws://localhost:8080');
執行上面語句之後,客戶端就會與伺服器進行連接。
2.狀態返回
readyState屬性返回實例對象的當前狀態,共有四種。
CONNECTING:值為0,表示正在連接。
OPEN:值為1,表示連接成功,可以通信了。
CLOSING:值為2,表示連接正在關閉。
CLOSED:值為3,表示連接已經關閉,或者打開連接失敗。
下麵是一個示例。

switch (ws.readyState) {
case WebSocket.CONNECTING:
// do something
break;
case WebSocket.OPEN:
// do something
break;
case WebSocket.CLOSING:
// do something
break;
case WebSocket.CLOSED:
// do something
break;
default:
// this never happens
break;
}
3.回調函數
實例對象的onopen屬性,用於指定連接成功後的回調函數。

ws.onopen = function () {
ws.send('Hello Server!');
}
如果要指定多個回調函數,可以使用addEventListener方法。

ws.addEventListener('open', function (event) {
ws.send('Hello Server!');
});
4.關閉回調函數
實例對象的onclose屬性,用於指定連接關閉後的回調函數。

ws.onclose = function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
};

ws.addEventListener("close", function(event) {
var code = event.code;
var reason = event.reason;
var wasClean = event.wasClean;
// handle close event
});
5.指定伺服器數據後的回調函數
實例對象的onmessage屬性,用於指定收到伺服器數據後的回調函數。

ws.onmessage = function(event) {
var data = event.data;
// 處理數據
};

ws.addEventListener("message", function(event) {
var data = event.data;
// 處理數據
});
註意,伺服器數據可能是文本,也可能是二進位數據(blob對象或Arraybuffer對象)。

ws.onmessage = function(event){
if(typeof event.data === String) {
console.log("Received data string");
}

if(event.data instanceof ArrayBuffer){
var buffer = event.data;
console.log("Received arraybuffer");
}
}
除了動態判斷收到的數據類型,也可以使用binaryType屬性,顯式指定收到的二進位數據類型。

// 收到的是 blob 數據
ws.binaryType = "blob";
ws.onmessage = function(e) {
console.log(e.data.size);
};

// 收到的是 ArrayBuffer 數據
ws.binaryType = "arraybuffer";
ws.onmessage = function(e) {
console.log(e.data.byteLength);
};
6.向伺服器發送數據
實例對象的send()方法用於向伺服器發送數據。
發送文本的例子。

ws.send('your message');
發送 Blob 對象的例子。

var file = document
.querySelector('input[type="file"]')
.files[0];
ws.send(file);
發送 ArrayBuffer 對象的例子。

// Sending canvas ImageData as ArrayBuffer
var img = canvas_context.getImageData(0, 0, 400, 320);
var binary = new Uint8Array(img.data.length);
for (var i = 0; i < img.data.length; i++) {
binary[i] = img.data[i];
}
ws.send(binary.buffer);
7.錯誤處理方式
實例對象的onerror屬性,用於指定報錯時的回調函數。

socket.onerror = function(event) {
// handle error event
};

socket.addEventListener("error", function(event) {
// handle error event
});
8.數據長度判定
實例對象的bufferedAmount屬性,表示還有多少位元組的二進位數據沒有發送出去。它可以用來判斷發送是否結束。

var data = new ArrayBuffer(10000000);
socket.send(data);

if (socket.bufferedAmount === 0) {
// 發送完畢
} else {
// 發送還沒結束
}

四、伺服器方面
有很多常用的NODE
現在只說一個特別的wobsocketd
它的最大特點,就是後臺腳本不限語言,標準輸入(stdin)就是 WebSocket 的輸入,標準輸出(stdout)就是 WebSocket 的輸出。

舉例來說,下麵是一個 Bash 腳本counter.sh。

#!/bin/bash

echo 1
sleep 1

echo 2
sleep 1

echo 3
命令行下運行這個腳本,會輸出1、2、3,每個值之間間隔1秒。

$ bash ./counter.sh
1
2
3
現在,啟動websocketd,指定這個腳本作為服務。

$ websocketd --port=8080 bash ./counter.sh
上面的命令會啟動一個 WebSocket 伺服器,埠是8080。每當客戶端連接這個伺服器,就會執行counter.sh腳本,並將它的輸出推送給客戶端。

var ws = new WebSocket('ws://localhost:8080/');

ws.onmessage = function(event) {
console.log(event.data);
};
上面是客戶端的 JavaScript 代碼,運行之後會在控制台依次輸出1、2、3。
有了它,就可以很方便地將命令行的輸出,發給瀏覽器。

$ websocketd --port=8080 ls
上面的命令會執行ls命令,從而將當前目錄的內容,發給瀏覽器。使用這種方式實時監控伺服器,簡直是輕而易舉(代碼)。

更多的用法可以參考官方示例。
Bash 腳本讀取客戶端輸入的例子
五行代碼實現一個最簡單的聊天伺服器

websocketd 的實質,就是命令行的 WebSocket 代理。只要命令行可以執行的程式,都可以通過它與瀏覽器進行 WebSocket 通信。下麵是一個 Node 實現的回聲服務greeter.js。

process.stdin.setEncoding('utf8');

process.stdin.on('readable', function() {
var chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write('data: ' + chunk);
}
});
啟動這個腳本的命令如下。

$ websocketd --port=8080 node ./greeter.js
官方倉庫還有其他各種語言的例子。

 

總結:

websocket的在即時通信方面的作用還是相對巨大的,畢竟解決了ajax如果反覆請求時候的大的訪問壓力,所以如果有機會應該進一步對其進行研究。


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

-Advertisement-
Play Games
更多相關文章
  • 整理自互聯網 整理做隨筆 如有相似純屬抄襲 淺拷貝和深拷貝都是對於JS中的引用類型而言的,淺拷貝就只是複製對象的引用(堆和棧的關係,簡單類型Undefined,Null,Boolean,Number和String是存入堆,直接引用,object array 則是存入桟中,只用一個指針來引用值),如果 ...
  • 零、組織結構 根據引言,作者將全書劃分為四個部分: 一、頁面載入js的最佳方式(開發前準備) 二、改善js代碼的編程技巧(開發中) 三、構建與部署(發佈) 四、發佈後性能檢測與問題追蹤(線上問題優化) 這樣的組織結構也符合我們的開發習慣,首先進入第一部分。 一、JavaScript載入 起因:scr ...
  • 一、什麼是匿名函數 創建一個函數並將它賦值給變數functionName,這種情況下創建的函數,即匿名函數。(函數表達式就是匿名函數) 二、閉包 1.什麼是閉包? 閉包就是能夠讀取其他函數內部變數的函數。 只有函數內部的子函數才能讀取局部變數,因此可以把閉包簡單理解成“定義在一個函數內部的函數”。 ...
  • html部分 版本號 <script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script> <!DOCTYPE html><html><head><meta charset="UTF-8"><title></title><style> ...
  • JS為每種數據類型都內置很多方法,真的不好記憶,而且有些還容易記混,現整理如下,以便以後查看: 一、String ①charAt()方法用於返回指定索引處的字元。返回的字元是長度為 1 的字元串。 語法:stringObject.charAt(index) index 必需,表示字元串中某個位置的數 ...
  • localStorage - 沒有時間限制的數據存儲 sessionStorage - 針對一個 session 的數據存儲 共同點:sessionStorage、localStorage和cookie都由瀏覽器存儲在本地的數據。 區別: cookie數據始終在同源的http請求中攜帶(即使不需要) ...
  • 作為一名使用了一段時間Vue.js的新手,相信和不少初入Vue的朋友一樣,都對Vue-cli的配置一知半解。後來通過對webpack的學習,也算是對腳手架的配置有了一定的瞭解,所以也想把這段時間自己的成果分享給大家,希望能和大家一起進步。 有兩點要說明的: 閱讀本文需要瞭解一點點webpack的知識 ...
  • 因為ECMAscript中所有數值都是以IEEE-75464格式存儲,所以才會誕生了位操作符的概念. 位操作符作用於最基本的層次上,因為數值按位存儲,所以位操作符的作用也就是操作數值的位.不過位操作符並不能操作64位的值.所以位操作符會先將64位的值轉換成32位的值,然後執行操作,最後再將結果轉換成 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...