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.

8 回复
[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))
    }
});

执行上面的代码,在模拟器的日志中就会有很多错误日志:

cke_447.gif

现在不知道是哪里引发的问题,可能是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方法,以实现二进制数据的传输。如果遇到问题,请检查代码实现或确认使用的鸿蒙版本是否支持该功能。

回到顶部