您好,小程序模板欢迎您。
小程序模板
当前位置 : 首页> 小程序教程> 如何在onSocketOpen事件中发送数据?

如何在onSocketOpen事件中发送数据?

你想知道在微信小程序的 `onSocketOpen` 事件回调中,具体如何正确地发送数据到 WebSocket 服务器。


### 在 `onSocketOpen` 中发送数据的具体方法


#### 1. 核心原理

`onSocketOpen` 事件的触发,标志着 WebSocket 连接已成功建立,此时调用 `wx.sendSocketMessage` API 发送数据才是安全有效的。发送数据的核心就是在该回调函数内调用 `wx.sendSocketMessage`。


#### 2. 发送数据的完整步骤

1. **监听连接成功**:在 `onSocketOpen` 回调中确认连接状态

2. **准备数据**:将需要发送的数据格式化为字符串(通常用 JSON)或二进制

3. **调用发送 API**:使用 `wx.sendSocketMessage` 发送数据

4. **处理发送结果**:通过 `success`/`fail`/`complete` 回调处理发送状态


#### 3. 完整代码示例

```javascript

// 1. 建立 WebSocket 连接

wx.connectSocket({

  url: 'wss://your-server.com/ws',

  header: {

    'Authorization': 'Bearer your-token'

  }

});


// 2. 监听连接成功事件

wx.onSocketOpen((res) => {

  console.log('WebSocket 连接已打开,可以发送数据了');


  // 3. 准备要发送的数据

  const sendData = {

    type: 'login',

    userId: 'user123',

    timestamp: Date.now()

  };


  // 4. 发送文本数据(最常用)

  wx.sendSocketMessage({

    // 将对象序列化为 JSON 字符串

    data: JSON.stringify(sendData),

    success: (res) => {

      console.log('数据发送成功', res);

    },

    fail: (err) => {

      console.error('数据发送失败', err);

    },

    complete: () => {

      console.log('发送操作完成');

    }

  });


  // 5. 发送二进制数据(可选)

  // const buffer = new ArrayBuffer(4);

  // const dataView = new DataView(buffer);

  // dataView.setUint32(0, 123456);

  // wx.sendSocketMessage({

  //   data: buffer, // 直接传入 ArrayBuffer

  //   success: (res) => {

  //     console.log('二进制数据发送成功', res);

  //   }

  // });

});


// 监听服务器返回的消息

wx.onSocketMessage((res) => {

  console.log('收到服务器消息:', res.data);

  // 解析服务器返回的 JSON 数据

  const responseData = JSON.parse(res.data);

  console.log('解析后的消息:', responseData);

});

```


#### 4. 关键注意事项

- **数据格式**:`wx.sendSocketMessage` 的 `data` 参数支持**字符串**或 **ArrayBuffer**。发送对象时,必须先用 `JSON.stringify()` 序列化为字符串。

- **错误处理**:务必添加 `fail` 回调,处理网络异常或发送失败的情况。

- **多次发送**:可以在 `onSocketOpen` 中发送初始化数据,后续根据业务逻辑(如用户操作)在其他地方调用 `wx.sendSocketMessage`。

- **页面上下文**:如果需要在回调中访问页面的 `this`(如更新页面数据),需提前保存:

  ```javascript

  // 在页面中

  Page({

    onLoad() {

      const that = this; // 保存页面实例

      wx.onSocketOpen(() => {

        // 发送数据

        wx.sendSocketMessage({

          data: JSON.stringify({action: 'init'}),

          success() {

            that.setData({ // 使用保存的 that 访问页面方法

              socketStatus: 'connected'

            });

          }

        });

      });

    }

  });

  ```


### 总结

1. 在 `onSocketOpen` 回调中直接调用 `wx.sendSocketMessage` 即可发送数据,这是最安全的发送时机。

2. 发送对象数据时,需用 `JSON.stringify()` 转换为字符串;二进制数据可直接传入 ArrayBuffer。

3. 必须添加 `success`/`fail` 回调来处理发送结果,并根据需要维护页面上下文。


联系客服 意见反馈

签到成功!

已连续签到1天,签到3天将获得积分VIP1天

知道了