ReactNative中使用WebSocket

这篇博客通过一个生动的遥控炸弹的例子解释了发布订阅模式,展示了如何使用WebSocket进行实时通信。文中介绍了NetManager类,用于管理WebSocket连接,并通过MessageProcess类处理消息监听和回调。在应用启动时初始化网络连接,发送消息并等待响应,体现了发布订阅模式在通信中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

举个例子:
张三是个法外狂徒,它要去复仇,他想去炸掉仇家的房子。他来到仇家所在的小区,拿出自己准备的炸弹(监听)丢进仇家的屋里(页面),等他走出小区立马掏出遥控器(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)
        }
      })
    })
  }
}

### 如何在 React Native使用 WebSocket 进行实时通信 为了实现实时通信功能,在 React Native 应用程序中可以利用 WebSocket 技术。WebSocket 提供了一种全双工通信信道,允许客户端和服务端之间持续连接并交换数据。 #### 创建 WebSocket 实例 通过 JavaScript 的内置 `WebSocket` 对象来创建一个新的 WebSocket 连接: ```javascript const ws = new WebSocket('ws://yourserver.com/socket'); ``` 此代码片段初始化了一个新的 WebSocket 连接到指定服务器地址[^1]。 #### 处理事件监听器 设置几个重要的事件处理函数以便管理连接状态以及接收消息: ```javascript // 当成功建立连接时触发 ws.onopen = () => { console.log('Connected to server'); }; // 接收到服务端发送的消息时调用 ws.onmessage = (event) => { const message = JSON.parse(event.data); console.log(`Received from server: ${JSON.stringify(message)}`); }; // 发生错误时执行 ws.onerror = (error) => { console.error(`WebSocket error observed:`, error); }; // 断开连接时运行 ws.onclose = () => { console.log('Disconnected from server'); }; ``` 这些回调方法帮助开发者更好地控制整个生命周期内的交互过程。 #### 向服务端发送信息 一旦建立了稳定可靠的链接之后就可以随时向远端的服务节点推送任意格式的数据包了: ```javascript function sendMessage(data){ if(ws.readyState === WebSocket.OPEN){ ws.send(JSON.stringify(data)); console.log(`Sent data: ${JSON.stringify(data)}`); }else{ console.warn("Connection is not open"); } } ``` 上述逻辑确保只有当通道处于开放状态下才会尝试传输有效载荷;否则会给出警告提示。 #### 关闭 WebSocket 链接 最后不要忘记定义一种机制用于优雅地终止现有的 session : ```javascript function closeConnection(){ if(ws && ws.readyState !== WebSocket.CLOSED){ ws.close(); console.log('Closing connection...'); } } ``` 这一步骤对于释放资源非常重要,并且有助于防止潜在的安全隐患或性能瓶颈问题的发生。 综上所述,以上就是在 React Native 项目里集成 WebSocket 客户端所需的全部基础知识和技术要点。值得注意的是,实际开发过程中可能还需要考虑更多细节方面的要求,比如重连策略、心跳检测等高级特性[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值