(記)在remax,小程式,react hooks中使用實時通訊
1.建立一個wxsocket.js
import {
connectSocket,
onSocketOpen,
onSocketClose,
sendSocketMessage,
onSocketMessage,
getNetworkType,
closeSocket,
onNetworkStatusChange
} from 'remax/wechat';
class Websocket {
constructor({ heartCheck, isReconnection }) {
this.init = false;
// 是否連線
this.isConnect = false;
// 當前網路狀態
this.netWork = true;
// 是否人為退出
this.isClosed = false;
// 心跳檢測頻率
this.timeout = 3000;
this.timeoutObj = null;
// 當前重連次數
this.connectNum = 0;
// 心跳檢測和斷線重連開關,true為啟用,false為關閉
this.heartCheck = heartCheck;
this.isReconnection = isReconnection;
this.wsUrl = "";
this.onSocketOpened();
}
// 心跳重置
reset () {
clearTimeout(this.timeoutObj);
return this;
}
// 心跳開始
start () {
let self = this;
this.timeoutObj = setInterval(() => {
sendSocketMessage({
// 心跳傳送的資訊應由前後端商量後決定
data: JSON.stringify({
"beat": 'dj'
}),
success (res) {
// console.log(res)
// console.log("傳送心跳成功");
},
fail (err) {
console.log(err);
// this.reConnect(options)
console.log('連線失敗');
self.reset();
}
}).then();
}, this.timeout);
}
// 監聽websocket連線關閉
onSocketClosed (options) {
onSocketClose(err => {
console.log('當前websocket連線已關閉,錯誤資訊為:' + JSON.stringify(err));
// 停止心跳連線
if (this.heartCheck) {
this.reset();
}
// 關閉已登入開關
this.isConnect = false;
// 檢測是否是使用者自己退出小程式
if (!this.isClosed) {
// 進行重連
if (this.isReconnection) {
this.reConnect(options);
}
}
});
}
// 檢測網路變化
onNetworkChange (options) {
onNetworkStatusChange(res => {
console.log('當前網路狀態:' + res.isConnected);
if (!this.netWork) {
this.isConnect = false;
// 進行重連
if (this.isReconnection) {
this.reConnect(options);
}
}
});
}
onSocketOpened (callBack) {
onSocketOpen(res => {
console.log('websocket已開啟');
// 開啟已登入開關
this.isConnect = true;
// 傳送心跳
if (this.heartCheck) {
this.reset().start();
}
// 傳送登入資訊
sendSocketMessage({
// 這裡是第一次建立連線所傳送的資訊,應由前後端商量後決定
data: JSON.stringify({
"beat": 'dj'
})
}).then();
// 開啟網路開關
this.netWork = true;
if (typeof callBack == "function") {
callBack(res);
}
});
}
// 接收伺服器返回的訊息
onReceivedMsg (callBack) {
onSocketMessage(msg => {
if (typeof callBack == "function") {
callBack(msg);
}
});
}
// 建立websocket連線
initWebSocket (options) {
let self = this;
this.wsUrl = options.url ? options.url : this.wsUrl;
if (this.isConnect) {
console.log("您已連線了");
} else {
// 檢查網路
getNetworkType({
success (res) {
if (res.networkType !== 'none') {
// 開始建立連線
connectSocket({
url: self.wsUrl,
success (res) {
if (typeof options.success == "function") {
options.success(res);
}
},
fail (err) {
if (typeof options.fail == "function") {
options.fail(err);
console.log('連線失敗');
}
}
});
} else {
console.log('網路已斷開');
self.netWork = false;
}
}
}).then();
}
}
// 傳送websocket訊息
sendWebSocketMsg (options) {
// console.log("send引數:", options)
sendSocketMessage({
data: options.data,
success (res) {
if (options.success && typeof options.success == "function") {
options.success(res);
}
},
fail (err) {
if (options.fail && typeof options.fail == "function") {
options.fail(err);
}
}
}).then();
}
// 重連方法,會根據時間頻率越來越慢
reConnect (options) {
let timer, self = this;
if (this.connectNum < 3) {
timer = setTimeout(() => {
this.initWebSocket(options);
}, 3000);
this.connectNum += 1;
} else if (this.connectNum < 10) {
timer = setTimeout(() => {
this.initWebSocket(options);
}, 10000);
this.connectNum += 1;
} else {
timer = setTimeout(() => {
this.initWebSocket(options);
}, 450000);
this.connectNum += 1;
}
}
// 關閉websocket連線
closeWebSocket () {
closeSocket().then();
this.isClosed = true;
this.isConnect = false;
}
}
const websocket = new Websocket({
// true代表啟用心跳檢測和斷線重連
heartCheck: true,
isReconnection: true
});
export default websocket;
2.使用
import websocket from "../../utils/wxsocket";
React.useEffect(() => {
if (token) {
const wsUrl = process.env.NODE_ENV === 'development' ? `wss://test.onemorecar.cn/ws/notify?token=${token}` : `wss://tt.onemorecar.cn/ws/notify?token=${token}`;
if (!websocket.init) {
websocket.initWebSocket({ url: wsUrl });
websocket.onSocketClosed({
url: wsUrl
})
websocket.onNetworkChange({
url: wsUrl
})
websocket.onReceivedMsg(res => {
console.log('app.js收到伺服器內容:' + res.data);
const { msg, count, status } = JSON.parse(res.data);
if (count) {
notify.setNotify(count);
}
});
}
}
},[])
相關文章
- 在小程式中使用 React with HooksReactHook
- 在 React 專案中全量使用 HooksReactHook
- 在Canvas中使用React HooksCanvasReactHook
- 在react native中使用hooksReact NativeHook
- 在React類元件中使用Hooks的實踐技巧React元件Hook
- 小程式即時通訊demo
- 通過 React Hooks 宣告式地使用 setIntervalReactHook
- react中hooks的使用方法ReactHook
- 思否開源專案推介丨Remax:使用 React 構建跨平臺小程式REMReact
- 在Spring Boot中實現WebSocket實時通訊Spring BootWeb
- React Hooks 札記ReactHook
- 在 React Hooks 中如何請求資料?ReactHook
- Oracle實時程式通訊Oracle
- 使用React Hooks時遇到的錯誤提示ReactHook
- 實現 React HooksReactHook
- React hooks實踐ReactHook
- React State Hooks的閉包陷阱,在使用Hooks之前必須掌握ReactHook
- Redux在React中的使用小結ReduxReact
- [譯] 在 React Hooks 中如何請求資料?ReactHook
- Oracle實時程式通訊(轉)Oracle
- Taro 小程式開發大型實戰(一):熟悉的 React,熟悉的 HooksReactHook
- React Hooks 使用詳解ReactHook
- 使用 React Hooks 宣告 setIntervalReactHook
- React Hooks:初探·實踐ReactHook
- React Hooks 實用指南ReactHook
- React Hooks 入門記錄ReactHook
- 如何在微信小程式中實現音視訊通話微信小程式
- 使用Oracle實現實時通訊(轉)Oracle
- 使用70行程式碼配合hooks重新實現react-redux行程HookReactRedux
- dart系列之:實時通訊,在瀏覽器中使用WebSocketsDart瀏覽器Web
- React Hooks使用避坑指南ReactHook
- react hooks 的簡單使用ReactHook
- 在專案中的更換 React Hooks 注意事項ReactHook
- React hooks實戰總結ReactHook
- React Hooks的學習筆記ReactHook筆記
- 【譯】在React Hooks 中使用useReducer的幾種用例ReactHookuseReducer
- [react] hooksReactHook
- React HooksReactHook