6.2 KiB
bricks.WebSocket 技术文档
基于 WebSocket 的通信组件,继承自
bricks.VBox,用于在前端与后端之间建立双向实时通信通道。支持文本、Base64 编码的音视频数据等消息类型的发送与接收。
概述
bricks.WebSocket 是一个封装了原生 WebSocket 功能的类,提供了更便捷的事件处理机制和数据封装方法。它允许开发者通过简单的配置连接到指定的 WebSocket 服务,并支持会话认证(session)以及多种类型的消息收发。
该类通过 bricks.Factory.register 注册为可复用组件,适用于 bricks UI 框架体系。
继承关系
- 父类:
bricks.VBox - 子类:
bricks.WebSocket
构造函数
new bricks.WebSocket(options)
参数
| 参数 | 类型 | 必填 | 描述 |
|---|---|---|---|
options.ws_url |
String |
✅ | WebSocket 服务器地址(如:ws://localhost:8080/ws) |
options.with_session |
Boolean |
❌ | 是否携带当前应用会话信息进行连接,默认为 false |
示例
var ws = new bricks.WebSocket({
ws_url: 'ws://example.com/ws',
with_session: true
});
当
with_session: true时,系统将调用bricks.app.get_session()获取会话标识并作为协议参数传递给 WebSocket 构造函数(注意:代码中存在拼写错误sessopn应为session)。
事件回调
bricks.WebSocket 支持以下事件监听,可通过 on(event, handler) 方法绑定:
| 事件名 | 触发时机 | 回调参数 |
|---|---|---|
onopen |
WebSocket 连接成功打开时 | 无 |
onclose |
WebSocket 连接关闭时 | 无 |
onerror |
WebSocket 发生错误时 | 错误对象 |
ontext |
接收到类型为 text 的消息时 |
文本数据 |
onbase64audio |
接收到 Base64 编码的音频数据时 | Base64 字符串 |
onbase64video |
接收到 Base64 编码的视频数据时 | Base64 字符串 |
on{type} |
接收到任意自定义类型 {type} 的消息时 |
数据体 |
所有事件均通过
this.dispatch(eventname, data)触发,可使用标准事件监听机制订阅。
方法说明
on_open(e)
WebSocket 连接打开时的内部处理函数。
- 触发
onopen事件 - 控制台输出
"open"
on_close(e)
WebSocket 连接关闭时的内部处理函数。
- 触发
onclose事件 - 控制台输出
"close"
on_error(e)
WebSocket 发生错误时的内部处理函数。
- 触发
onerror事件 - ⚠️ Bug 提示:日志中
console.log(error)应为console.log(e),否则会抛出未定义变量异常。
on_message(e)
处理接收到的消息。
流程:
- 解析
e.data为 JSON 对象,格式应为:{ "type": "text", "data": "Hello World" } - 根据
type动态生成事件名(如type: "text"→ 事件ontext) - 使用
this.dispatch(eventname, d.data)派发事件
支持扩展任意消息类型,只需确保服务端发送的数据结构符合规范。
send_text(text)
发送纯文本消息。
参数
text(String):要发送的文本内容
示例
ws.send_text("Hello from client");
发送格式
{ "type": "text", "data": "Hello from client" }
send_base64_video(b64video)
发送 Base64 编码的视频数据。
参数
b64video(String):Base64 编码的视频字符串(不含前缀如data:video/mp4;base64,)
示例
ws.send_base64_video(videoBase64Data);
发送格式
{ "type": "base64video", "data": "...base64..." }
send_base64_audio(b64audio)
发送 Base64 编码的音频数据。
参数
b64audio(String):Base64 编码的音频字符串
示例
ws.send_base64_audio(audioBase64Data);
发送格式
{ "type": "base64audio", "data": "...base64..." }
send_typedata(type, data)
发送指定类型的消息(通用接口)。
参数
type(String):消息类型(如"custom")data(Any):任意可序列化数据
返回值
undefined(但调用了send(d))
⚠️ Bug 提示:方法体内
return send(d);应为return this.send(d);,否则send函数无法正确调用。
send(d)
底层消息发送方法,负责序列化并发送数据。
参数
d(Object):消息对象,格式如下:{ type: String, data: Any }
行为
- 使用
JSON.stringify(d)序列化对象 - 调用
this.ws.send(s)发送字符串
已知问题 / 注意事项
| 问题 | 说明 | 建议修复 |
|---|---|---|
sessopn 拼写错误 |
constructor 中 sessopn 应为 session |
更正为 this.ws = new WebSocket(this.ws_url, session); |
console.log(error) 错误引用 |
on_error 方法中变量名错误 |
改为 console.log(e); |
send_typedata 调用错误 |
send(d) 应为 this.send(d) |
修正为 return this.send(d); |
| 缺少连接状态管理 | 未暴露 readyState 或重连机制 |
可增加 isConnected() 方法 |
使用示例
// 创建 WebSocket 实例
var ws = new bricks.WebSocket({
ws_url: 'ws://localhost:3000/ws',
with_session: true
});
// 绑定事件
ws.on('onopen', function() {
console.log('Connected!');
ws.send_text('Client ready');
});
ws.on('ontext', function(data) {
console.log('Received text:', data);
});
ws.on('onbase64video', function(videoData) {
document.getElementById('video').src = 'data:video/webm;base64,' + videoData;
});
注册为工厂组件
bricks.Factory.register('WebSocket', bricks.WebSocket);
允许通过工厂模式创建实例:
var instance = bricks.Factory.create('WebSocket', { ws_url: '...' });
总结
bricks.WebSocket 是一个轻量级、易于集成的 WebSocket 封装组件,适合用于实时通信场景(如聊天、音视频流推送、远程控制等)。尽管存在少量代码缺陷,但整体设计清晰,具备良好的扩展性和事件驱动特性。
建议在实际使用前修复上述指出的问题以保证稳定性。