使用Websocket收發數據
來自專欄雨叔4 人贊了文章
Websocket相信很多開發者都聽說過,但很多人並不理解,或者理解卻沒有應用過,本文以一個簡單的例子一步步指引,讓你了解如何使用它。
一、什麼是Websocket
相對於Websocket,我們常用的獲取數據方式是Rest。一般沒有特殊要求的應用,我們會通過Rest方式收發數據,Rest即用戶端發送網路請求,服務端即時返回數據。Rest和Websocket的主要區別在於,Websocket是服務端主動推送,而Rest是服務端被動(收到請求後)推送。
二、舉個簡單的例子
男生向女生表白,男生:在一起吧。女生:不。男生很沮喪,於是每天都問一遍(輪詢請求數據),女生總是否定(返回數據),終於有一天,女生無法忍受這種叨擾拉黑對方(403 Error)。
而Websoket是這樣的,男生告訴女生:如果可以在一起,請通知我(Handshake)。過很久很久,也許是5年吧,女生回復:嗯。
這樣就能說明問題,使用Websocket收發數據,不需要輪詢消耗用戶端性能,而且消息是即時的,即在服務端狀態發生改變的時候主動推送數據。這樣,Websocket就很適合即時消息聊天應用。
三、代碼示例
安裝ws模塊:
npm install ws --save
引入ws模塊:
const WebSocket = require(ws);
服務端:
const WebSocket = require(ws);const wss = new WebSocket.Server({port: 8080});wss.on(connection, function connection(ws) { ws.on(message, function incoming(message) { console.log(Got a question: + message); if (message === Do you love me?) { const randomTime = Math.floor(Math.random() * 10000) setTimeout(function () { const answer = Yes, I do. ws.send(answer); console.log(After + randomTime / 1000 + seconds, I said: + answer); }, randomTime); } });});
這段代碼實現的功能是,如果接收到「Do you love me?」的消息,在10秒內的隨機時間,推送「Yes, I do.」。
用戶端:
const WebSocket = require(ws);const ws = new WebSocket(ws://localhost:8080);ws.on(open, function open() { const question = Do you love me? ws.send(question); console.log(I asked a question: + question);});ws.on(message, function incoming(data) { console.log(Now, I got: + data);});
這段代碼實現的功能是,向服務端發送消息「Do you love me?」,然後等待服務端的推送消息,因為服務端推送時間是隨機的,所以一直是等待狀態。
實現效果:
I asked a question: Do you love me? // 用戶端Got a question: Do you love me? // 服務端After 4.456 seconds, I said: Yes, I do. // 服務端Now, I got: Yes, I do. // 用戶端
Websocket已經有現成的輪子可以用,這樣寫業務代碼就省時省力。除了即時消息這一應用場景,Websocket也越來越多地運用與量化交易領域,未來仍有更多的應用場景等待發掘。
推薦閱讀:
※C# 完成WebSocket demo
※Spring boot+web Socket即時通訊
※WebSocket客戶端連接不上和掉線的問題以及解決方案
※全雙工通信的 WebSocket