HarmonyOS鸿蒙Next中请问WebSocket.send不支持ArrayBuffer?
HarmonyOS鸿蒙Next中请问WebSocket.send不支持ArrayBuffer?
调用ws.send()发送一个ArrayBuffer, 在应用层一直报参数错误,在模拟器的日志中发现很多类似下面的错误:
[send_context.cpp:96] SendContext Parse Failed
[base_async_work.h:48] parameter error
请问websocket发送ArrayBuffer有什么要求和限制吗?模拟器的版本是HarmonyOS NEXT Release.
[module_template.h:97] js invoke WebSocketSend
[send_context.cpp:96] SendContext Parse Failed
[base_async_work.h:48] parameter error
更多关于HarmonyOS鸿蒙Next中请问WebSocket.send不支持ArrayBuffer?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
我知道什么问题了 我的发送的数据是 `sendData: Uint8Array` 要使用arraybuffer 发送 `sendData.buffer`,
我的也是这个问题 奇怪了
感谢您的回复,我是在用Uniapp开发鸿蒙版的App,
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setInt32(0, 123);
ws.send({
data:buffer,
success: function (e) {
console.log("send success")
},
fail: function (e) {
console.log("send fail", JSON.stringify(e))
}
});
执行上面的代码,在模拟器的日志中就会有很多错误日志:
现在不知道是哪里引发的问题,可能是UniApp封装鸿蒙WebSocket导致的问题?
使用这个demo发arraybuffer,我尝试了下是ok的
import { webSocket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct WebSocketPage {
@State message: string = 'Hello World';
aboutToAppear(): void {
this.websocketTest()
}
build() {
RelativeContainer() {
Text(this.message)
.id('WebSocketPageHelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
}.height('100%').width('100%')
}
websocketTest() {
let defaultIpAddress = "ws://";
let ws = webSocket.createWebSocket();
ws.on('open', (err: BusinessError, value: Object) => {
const buffer = new ArrayBuffer(8);
const view = new DataView(buffer);
view.setInt32(0, 123);
console.log("on open, status:" + JSON.stringify(value));
// 当收到on('open')事件时,可以通过send()方法与服务器进行通信
ws.send(buffer, (err: BusinessError, value: boolean) => {
if (!err) {
console.log("Message sent successfully");
} else {
console.log("Failed to send the message. Err:" + JSON.stringify(err));
}
});
});
ws.on('message', (err: BusinessError, value: string | ArrayBuffer) => {
console.log("on message, message:" + value);
// 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接
if (value === 'bye') {
ws.close((err: BusinessError, value: boolean) => {
if (!err) {
console.log("Connection closed successfully");
} else {
console.log("Failed to close the connection. Err: " + JSON.stringify(err));
}
});
}
});
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));
});
ws.connect(defaultIpAddress, (err: BusinessError, value: boolean) => {
if (!err) {
console.log("Connected successfully");
} else {
console.log("Connection failed. Err:" + JSON.stringify(err));
}
});
}
}
IDE版本5.0.3.910
基本信息
- 名称: 示例名称
- 版本: v1.0.0
- 更新时间: 2023-10-10
- 作者: 张三
- 联系方式: zhangsan@example.com
说明
这是一个示例说明。你可以在这里添加更多详细信息。
在HarmonyOS鸿蒙Next中,WebSocket.send方法确实支持ArrayBuffer。根据鸿蒙的官方文档,WebSocket.send可以接受多种数据类型作为参数,包括字符串、ArrayBuffer、Blob等。具体到ArrayBuffer,你可以直接将其作为参数传递给send方法,WebSocket会将其作为二进制数据发送。例如:
let arrayBuffer = new ArrayBuffer(8);
let view = new Uint8Array(arrayBuffer);
view[0] = 42;
websocket.send(arrayBuffer);
这段代码创建了一个8字节的ArrayBuffer,并将其通过WebSocket发送。鸿蒙的WebSocket实现会正确处理ArrayBuffer,并确保其以二进制形式传输。
在HarmonyOS鸿蒙Next中,WebSocket API的send
方法确实支持ArrayBuffer
类型的数据传输。你可以直接将ArrayBuffer
对象传递给send
方法,以实现二进制数据的传输。如果遇到问题,请检查代码实现或确认使用的鸿蒙版本是否支持该功能。