簡述如何使用node+express實現接口鏈接及入門websocket通信。使用技術棧:node + express + typescript + websocket。前端
這裏描述前端如何模擬實現接口請求,使用的是express(基於node實現的能夠快速搭建web應用的開發框架),這裏使用node+express搭建一個簡單的web服務器。node
1) 初始化生成一個新的 package.json
文件web
npm init -y //-y(表明yes),跳過提問階段,直接生成文件。
2)安裝須要使用的npm包:node
, express
,ws
(即websocket)typescript
npm install node express ws --save
3)這裏使用ts開發,因此須要安裝ts須要使用的類型定義包(若是使用js就不要安裝了)express
npm install @types/node @types/express @types/ws -- save
4)安裝node熱更新依賴包nodemon
npm
npm install nodemon --save
新建demo-server.ts
文件
1)數據模擬json
// demo-server.ts export class Demodata { constructor( public id: number, public name: string, public desc: string) { } } const datas: Array<Demodata> = [ new Demodata(1, 'heimayu', 'this is my bolg name'), new Demodata(2, 'websocket', 'this chapter is introduce websocket'), new Demodata(3, 'express', 'you can use express to start webapp') ]
2)使用express快速搭建web服務器服務器
// demo-server.ts import * as express from 'express'; const app = express(); // 啓動服務器 app.listen(8001,'localhost',_=>{ console.log('demo服務器已啓動,訪問地址http://localhost:8001') })
// 接口請求-獲取數據 app.get('/datas', (req, res) => { res.send(datas) //數據發送 }) // 接口請求-根據id獲取數據 app.get('/datas/:id', (req, res) => { let url_id: number = req.params.id; let data: Demodata = datas.find(item => { return item.id == url_id }); res.send(data); })
將ts文件轉換成js文件後啓動熱更新命令 nodemon build/demo-server.js
websocket
訪問 http://localhost:8001/datas
app
訪問 http://localhost:8001/datas/1
接口實現!
WebSocket 是 HTML5 開始提供的一種在單個 TCP 鏈接上進行全雙工通信的協議。
【舉例】:好比咱們須要定時的獲取即時消息數,若是使用http請求,就必須輪詢,不停的建立http請求,資源浪費嚴重,此時可使用websocket來解決問題,使通訊更加高效。
node實現websocket有不少模塊可實現,這裏使用的是ws模塊
npm install ws --save
import { Server } from 'ws'; // 定義websocket服務器 const wsServer = new Server({ port: 8085 }); // 定義鏈接到的websocket集合 let socketSet = new Set<any>(); // 鏈接 wsServer.on('connection', websocket => { socketSet.add(websocket) }); // 初始化消息數 let message = 0; // 定時2s發送消息 setInterval(() => { socketSet.forEach(ws => { if (ws.readyState == 1) { ws.send(JSON.stringify({ message: message++ })) } else { socketSet.delete(ws); } }) }, 2000)
/** * url:鏈接的url * protocol:可選,接受的子協議 **/ var ws = new WebSocket(url,[protocol])
ws.readyState
事件 | 描述 |
---|---|
open | 鏈接創建時觸發 |
message | 客戶端接收服務端數據時觸發 |
error | 通訊發生錯誤 |
close | 鏈接關閉時觸發 |
方法 | 描述 |
---|---|
send() | 使用鏈接發送數據 |
close() | 關閉鏈接 |
// angular代碼 message: number = 0; // 消息數 ws: WebSocket; // 定義 ngOnInit() { // 初始化 this.ws = new WebSocket('ws://localhost:8085'); // 客戶端接收消息 this.ws.onmessage = (event) =>{ this.message = JSON.parse(event.data).message; } // 出錯 this.ws.onerror = (error) =>{ console.log(error); } // 關閉 this.ws.onclose = ()=>{ console.log('webSocket斷開鏈接') } }
即時通信成功!