你想知道在微信小程序的 `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` 回调来处理发送结果,并根据需要维护页面上下文。