前后端通信—后端主動給前端通信那種

# 前后端通信



## 1、websocket

?

? `websocket :長連接,雙向的。node搭建的websocket服務器,推送信息給客戶端瀏覽器`

* 前端

? ```html

? ? <!-- websocket.html -->

? ? <div id="clock"></div>

? ? <script>

? ? ? let clockDiv = document.getElementById('clock')

? ? ? let socket = new WebSocket('ws://localhost:9999')


? ? ? //當連接成功之后就會執行回調函數

? ? ? socket.onopen = function() {

? ? ? ? console.log('客戶端連接成功')

? ? ? ? //再向服務 器發送一個消息

? ? ? ? socket.send('hello') //客戶端發的消息內容 為hello

? ? ? }


? ? ? //綁定事件是用加屬性的方式

? ? ? socket.onmessage = function(event) {

? ? ? ? clockDiv.innerHTML = event.data

? ? ? ? console.log('收到服務器端的響應', event.data)

? ? ? }


? ? ? window.onload=function(){

? ? ? ? clockDiv.addEventListener('click',()=>{

? ? ? ? ? socket.send('clockDiv點擊事件')

? ? ? ? })

? ? ? }

? ? </script>

? ```



* 后端

? ```js

? ? // websocket.js

? ? /**

? ? * 依賴包

? ? *? npm i express ws -S

? ? */

? ? let express = require('express')

? ? let app = express()


? ? app.use(express.static(__dirname))

? ? //http服務器

? ? app.listen(3000)


? ? let WebSocketServer = require('ws').Server

? ? //用ws模塊啟動一個websocket服務器,監聽了9999端口


? ? let wsServer = new WebSocketServer({ port: 9999 })

? ? //監聽客戶端的連接請求 當客戶端連接服務器的時候,就會觸發connection事件


? ? //socket代表一個客戶端,不是所有客戶端共享的,而是每個客戶端都有一個socket


? ? wsServer.on('connection', function(socket) {

? ? ? //每一個socket都有一個唯一的ID屬性

? ? ? console.log(socket)

? ? ? console.log('客戶端連接成功')

? ? ?

? ? ? //監聽對方發過來的消息

? ? ? socket.on('message', function(message) {

? ? ? ? console.log('接收到客戶端的消息', message)

? ? ? ? socket.send('服務器回應:' + message)

? ? ? })


? ? ? setTimeout(()=>{

? ? ? socket.send('內容更新了:')

? ? ? },5000)


? ? })

? ```



## 2、Server-Sent Events(簡稱SSE)/EventSource

? `只是從服務器端往客戶端單向傳輸數據,感覺就隔幾秒發送一個get請求獲取數據`

* 前端

? ```html

? ? <!-- sse.html -->

? ? <div id="clok"></div>

? <script type="text/javascript">

? ? ? if ('EventSource' in window) {

? ? ? ? var source = new EventSource('http://127.0.0.1:8844/stream');

? ? ? ? var sseEl = document.getElementById('clok');

? ? ? ? source.addEventListener('open', function (event) {

? ? ? ? ? sseEl.innerHTML += '<p>Connection open ...</p>';

? ? ? ? }, false);

? ? ? ? source.addEventListener('message', function (event) {

? ? ? ? ? sseEl.innerHTML += ('<p>Ping: ' + event.data + '</p>');

? ? ? ? }, false);

? ? ? ? source.addEventListener('error', function (event) {

? ? ? ? ? sseEl.innerHTML += '<p>Connection close.</p>';

? ? ? ? }, false);

? ? ? ? source.addEventListener('connecttime', function (event) {

? ? ? ? ? ? sseEl.innerHTML += ('<p>Start time: ' + event.data + '</p>');

? ? ? ? ? }, false);

? ? ? ? // source.close();

? ? ? ? source.addEventListener('foo', function (event) {

? ? ? ? ? var data = event.data;

? ? ? ? ? // handle message

? ? ? ? }, false);

? ? ? }

? </script>

? ```


* 后端

? ```js

? ? // sse.js

? ? /**

? ? * 依賴包 npm i http -S

? ? */

? ? var http = require("http");


? ? http.createServer(function (req, res) {

? ? ? var fileName = "." + req.url;


? ? ? if (fileName === "./stream") {

? ? ? ? res.writeHead(200, {

? ? ? ? ? "Content-Type":"text/event-stream",

? ? ? ? ? "Cache-Control":"no-cache",

? ? ? ? ? "Connection":"keep-alive",

? ? ? ? ? "Access-Control-Allow-Origin": '*',

? ? ? ? });

? ? ? ? res.write("retry: 10000\n");

? ? ? ? res.write("event: connecttime\n");

? ? ? ? res.write(`data: ${(new Date())}\n\n`);

? ? ? ? res.write(`data: ${(new Date())}\n\n`);


? ? ? ? interval = setInterval(function () {

? ? ? ? ? res.write(`data:數據內容更新了1\n\n`);

? ? ? ? }, 1000);


? ? ? ? req.connection.addListener("close", function () {

? ? ? ? ? clearInterval(interval);

? ? ? ? }, false);

? ? ? }

? ? }).listen(8844, "127.0.0.1");

? ```

## 3、


> 參考資料

* [Web 實時推送技術的總結](https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651556073&idx=1&sn=7009b6f2c95e3e48254964f43e838d9b&chksm=80255f28b752d63e89e5e96b3d462ea025bb7a4cc03783e5c8f8c86fcfdcb51b8d3c901035b8&mpshare=1&scene=1&srcid=#rd)

* [Server-Sent Events 教程](http://www.ruanyifeng.com/blog/2017/05/server-sent_events.html)

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容