websocket(确认过眼神,就是朋友了)
定义:
是一种网络通信协议,用于在客户端和服务器之间建立持久、双向的实时通信连接,适用于实时交互的应用场景。
特点:
- 双向通信:WebSocket允许服务器和客户端之间进行双向通信;
- 持久连接:一旦连接成功,WebSocket会保持连接状态,直到一方主动断开连接(相对于Http请求,减少了频繁建立和关闭连接的开销);
- 基于TCP:数据传输的可靠性;
- 低延迟:数据可以在连接上可以快速传输,无需每次都建立新的连接。
使用:
- 创建WebSocket对象:
createWebSocket()
方法 - 和服务器建立连接:
connect()
方法 - 检测是否连接成功:
on('open')
事件的回调 - 连接成功后,接收服务器发送的信息:
on('message')
事件的回调,发信息给服务器send()
- 不用时,断开连接:
close()
,注意断开后,相关的websocket对象也会被销毁
typescript
import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
let defaultIpAddress = "ws://";
// 第一步:创建websocket通讯的对象
let ws = webSocket.createWebSocket();
// 第二步:连接服务器
ws.connect(defaultIpAddress, (err: BusinessError, value: boolean) => {
if (!err) {
console.log("Connected successfully");
} else {
console.log("Connection failed. Err:" + JSON.stringify(err));
}
});
// 第三步检测是否与服务器连接成功:on('open')事件的回调
ws.on('open', (err: BusinessError, value: Object) => {
console.log("on open, status:" + JSON.stringify(value));
// 第四步:收到on('open')事件时,就可以通过send()方法与服务器进行通信
ws.send("Hello, server!", (err: BusinessError, value: boolean) => {
if (!err) {
console.log("Message send successfully");
} else {
console.log("Failed to send the message. Err:" + JSON.stringify(err));
}
});
});
// 第四步:接收服务器发送的信息
ws.on('message', (err: BusinessError, value: string) => {
console.log("on message, message:" + value);
});
// 第五步:不用时,断开
ws.on('close', (err: BusinessError, value: webSocket.CloseResult) => {
console.log("on close, code is " + value.code + ", reason is " + value.reason);
});
// 错误事件处理
ws.on('error', (err: BusinessError) => {
console.log("on error, error:" + JSON.stringify(err));
});
心跳检测机制
概念:
在客户端和服务端建立WebSocket连接之后,每间隔30秒客户端会发送Ping帧给服务器,服务器收到后会立即回复Pong帧
bug以及处理方法
- 切换到后台的时候,WebSocket会断开连接??? 答:无长时任务的应用退到后台,大概15s会主动断开WebSocket连接或者系统强制断开TCP连接(有长时任务大概会60s左右断开),故我们需要应用切换到前台时,重新创建连接。可以在EntryAbility文件的
onForeground()
中重新连接。 第二个方法:采用Push Kit。应用在后台的时候,将接收并缓存该时段的所有信息,达到websocket在后台保活的效果(从后台功耗管控策略角度考虑,不建议) - websocket连接上就断开了??? 答:鸿蒙的底层有心跳检测机制,但是如果连接成功后,30s内不进行send(),那么底层会强制断开长连接;执行send()后就会一直保持长连接了。
后续有问题会及时补充上嘟