ReactNative中使用WebSocket

首先说说发布订阅这种设计模式,这种模式我给它起了个别名叫遥控炸弹。很多朋友理解不了这种模式,那——

举个例子:
张三是个法外狂徒,它要去复仇,他想去炸掉仇家的房子。他来到仇家所在的小区,拿出自己准备的炸弹(监听)丢进仇家的屋里(页面),等他走出小区立马掏出遥控器(emit)按下爆炸按钮,复仇成功。

注意: 以上例子你可能会误解为炸弹只能爆炸一次,其实炸弹可以一直存在房子里,只要你不将他清理掉。所以张三完成复仇后,他应该去把炸弹清理掉,免得一直在屋子里,容易被警方发现。每个炸弹还应该有自己的名字(key),按爆炸开关的时候就可以精确引爆了。

export default class WSNetwork {
  constructor(msgHandler) {
    this.init();
    this.msgHandler = msgHandler;
  }

  init() {
    this.wssocket = null;
    this.serverUrl = "ws://127.0.0.1:3000/websocket";
  }

  connect() {
    this.wssocket = new WebSocket(this.serverUrl);

    this.wssocket.onopen = this.onOpen.bind(this);
    this.wssocket.onclose = this.onClose.bind(this);
    this.wssocket.onerror = this.onError.bind(this);
    this.wssocket.onmessage = this.onMessage.bind(this);

  }

  //打开连接
  onOpen() {
    console.log("WS_OPEN")
  }

  //关闭连接
  onClose() {
    console.log("WS_CLOSE")
  }

  //连接出错
  onError(e) {
    console.log("WS_ERROR::", e)
  }

  //接收消息
  onMessage(event) {
    this.msgHandler(event);
  }
}
const WS_LISTENER = 'WS_LISTENER'

export default class MessageProcess {
  static httpCallbacks = {}
  
  static msgListener = {}
  
  static addMsgListener(serviceId, callBack) {
    this.msgListener[serviceId] = callBack;
  }

  static emitData(msg) {
    this.msgListener[WS_LISTENER](msg)
  }

  static msgHandler(msg) {
    MessageProcess.emitData(msg)
  }

  static addHttpCallback(key, cbObj) {
    MessageProcess.httpCallbacks[key] = cbObj
  }


  static initListener() {
    MessageProcess.addMsgListener(WS_LISTENER, MessageProcess.onHttpCallBack)
  }


  static onHttpCallBack(msg) {
    const key = msg.key
    const callData = MessageProcess.httpCallbacks[key]

    callData.callback(msg)

    delete MessageProcess.httpCallbacks[key]
  }
}

import WSNetwork from "./WSNetwork";
import MessageProcess from "./MsgProcess";

export default class NetManager {
  static network = null
  static msgId = 1

  //初始化网络(在应用启动时调用)
  static initNetwork() {
    NetManager.network = new WSNetwork(MessageProcess.msgHandler);
    NetworkManager.network.connect();
    MessageProcess.initListener();
  }

  //想server发送消息,应把NetManager.msgId传过去,server返回数据时再返回
  static sendMsg(msg) {
    return new Promise((resolve, reject) => {
      NetManager.network.wsSendMsg(msg)

      MessageProcess.addHttpCallback(NetManager.msgId++, {
        callback: (data) => {
          resolve(data)
        }
      })
    })
  }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
React Native 使用 WebSocket,可以使用内置的 `WebSocket` API。要实现心跳检测和重新连接机制,可以编写自定义的 WebSocket 类。 下面是一个简单的实现,可以用作参考: ```javascript class MyWebSocket { constructor(url) { this.ws = new WebSocket(url); this.heartBeatTimer = null; this.reconnectTimer = null; this.isClosed = false; this.ws.onopen = () => { this.heartBeat(); }; this.ws.onmessage = (event) => { // 处理收到的消息 }; this.ws.onerror = (error) => { console.log(`WebSocket error: ${error}`); this.reconnect(); }; this.ws.onclose = () => { console.log(`WebSocket closed`); this.isClosed = true; this.reconnect(); }; } send(data) { if (!this.isClosed) { this.ws.send(data); } } heartBeat() { this.send('heart beat'); this.heartBeatTimer = setTimeout(() => { this.heartBeat(); }, 10000); // 10秒检测一次心跳 } reconnect() { if (this.isClosed) { return; } if (this.reconnectTimer) { clearTimeout(this.reconnectTimer); } this.reconnectTimer = setTimeout(() => { console.log(`WebSocket reconnecting...`); this.ws = new WebSocket(this.ws.url); this.ws.onopen = () => { console.log(`WebSocket reconnected`); clearTimeout(this.reconnectTimer); this.isClosed = false; this.heartBeat(); }; this.ws.onmessage = (event) => { // 处理收到的消息 }; this.ws.onerror = (error) => { console.log(`WebSocket error: ${error}`); this.reconnect(); }; this.ws.onclose = () => { console.log(`WebSocket closed`); this.isClosed = true; this.reconnect(); }; }, 3000); // 3秒后尝试重新连接 } close() { this.isClosed = true; clearTimeout(this.heartBeatTimer); clearTimeout(this.reconnectTimer); this.ws.close(); } } ``` 这个自定义的 WebSocket 类具有心跳检测和重新连接机制。在初始化时,会创建一个 WebSocket 连接,并设置 `onopen`、`onmessage`、`onerror` 和 `onclose` 事件的回调函数。当连接打开时,会开始心跳检测;当连接关闭时,会尝试重新连接。在发送消息时,会检查连接是否已关闭,如果未关闭,则发送消息。关闭连接时,会清除定时器并关闭 WebSocket 连接。 使用这个自定义的 WebSocket 类时,只需实例化它,并调用其 `send` 方法发送消息: ```javascript const ws = new MyWebSocket('ws://localhost:8080'); ws.send('hello'); ``` 也可以在需要时关闭连接: ```javascript ws.close(); ``` 这样就可以在 React Native 使用 WebSocket,并实现心跳检测和重新连接机制了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值