HarmonyOS TCPSocket发送数据提示参数错误?

async wifiWriteData(data: ArrayBuffer): Promise<boolean> {
  console.log("WriteData:"+UintUtils.unit8ArrayToHexString(new Uint8Array(data)))
  let isSend: boolean = false
  let tcpSendOptions: socket.TCPSendOptions = {
    data: data
  }
  await this.mTcp?.send(tcpSendOptions).then(() => {
  isSend = true
}).catch((err: BusinessError) => {
  console.error('writeData fail,' + err.message + err.code);
  isSend = false
})
return isSend
}

mTcp用的是socket.TCPSocket,看发送的接口是支持ArrayBuffer,为什么会提示参数错误(Parameter error. 401)?

阅读 533
1 个回答

参考以下demo场景:

import { socket } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { buffer, util } from '@kit.ArkTS';

// 创建一个TCPSocketServer连接,返回一个TCPSocketServer对象。
let tcpServer: socket.TCPSocketServer = socket.constructTCPSocketServerInstance();
// 绑定本地IP地址和端口,进行监听

let ipAddress : socket.NetAddress = {} as socket.NetAddress;
ipAddress.address = "127.0.0.1";
ipAddress.port = 4651;
tcpServer.listen(ipAddress).then(() => {
  console.log('listen success');
}).catch((err: BusinessError) => {
  console.log('listen fail');
});

class SocketInfo {
  message: ArrayBuffer = new ArrayBuffer(1);
  remoteInfo: socket.SocketRemoteInfo = {} as socket.SocketRemoteInfo;
}

// 订阅TCPSocketServer的connect事件
tcpServer.on("connect", (client: socket.TCPSocketConnection) => {
  // 订阅TCPSocketConnection相关的事件
  client.on("close", () => {
    console.log("on close success");
  });
  client.on("message", (value: SocketInfo) => {
    let buffer = value.message;
    let dataView = new DataView(buffer);
    let str = "";
    for (let i = 0; i < dataView.byteLength; ++i) {
      str += String.fromCharCode(dataView.getUint8(i));
    }
    console.log("received message--:" + str);
    console.log("received address--:" + value.remoteInfo.address);
    console.log("received family--:" + value.remoteInfo.family);
    console.log("received port--:" + value.remoteInfo.port);
    console.log("received size--:" + value.remoteInfo.size);
  });

  // 向客户端发送数据
  let tcpSendOptions : socket.TCPSendOptions = {} as socket.TCPSendOptions;
  tcpSendOptions.data = 'Hello, client!';
  client.send(tcpSendOptions).then(() => {
    console.log('send success');
  }).catch((err: Object) => {
    console.error('send fail: ' + JSON.stringify(err));
  });

  // 关闭与客户端的连接
  client.close().then(() => {
    console.log('close success');
  }).catch((err: BusinessError) => {
    console.log('close fail');
  });

  // 取消TCPSocketConnection相关的事件订阅
  setTimeout(() => {
    client.off("message");
    client.off("close");
  }, 10 * 1000);
});

// 取消TCPSocketServer相关的事件订阅
setTimeout(() => {
  console.log("tcpServer connect off")
  tcpServer.off("connect");
}, 30 * 1000);

@Entry
@Component
struct TCPSocketServerTest {
  @State message: string = 'Hello World';

  strToArrayBuffer(str: string) {
    let buf = new ArrayBuffer(str.length * 2);
    let bufView = new Uint8Array(buf);
    for (let i = 0, strLen = str.length; i < strLen; i++) {
      bufView[i] = str.charCodeAt(i);
    }
    return bufView.buffer;
  }
  build() {
    RelativeContainer() {
      Text(this.message)
        .id('TCPSocketServerTestHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(()=>{
          let tcp: socket.TCPSocket = socket.constructTCPSocketInstance();
          let bindAddr: socket.NetAddress = {
            address: '127.0.0.1',
            port: 4651
          }
          tcp.bind(bindAddr, (err: BusinessError) => {
            if (err) {
              console.log('bind fail');
              return;
            }
            console.log('bind success');
          })

          let netAddress: socket.NetAddress = {
            address: '127.0.0.1',
            port: 4651
          }
          let tcpconnectoptions: socket.TCPConnectOptions = {
            address: netAddress,
            timeout: 6000
          }
          tcp.connect(tcpconnectoptions, (err: BusinessError) => {
            if (err) {
              console.log('connect fail');
              return;
            }
            console.log('connect success');
            let sendData = 'Hello, server!'
            let buffer2 = buffer.from(sendData).buffer
            let textEncoder = new util.TextEncoder("utf-8");
            let array: Uint8Array = textEncoder.encodeInto(sendData);
            let arrayBuffer = new ArrayBuffer(array.byteLength);
            let buffer3 = this.strToArrayBuffer(sendData)
            let tcpSendOptions: socket.TCPSendOptions = {
              data: buffer3
              // data: sendData
            }
            tcp.send(tcpSendOptions, (err: BusinessError) => {
              if (err) {
                console.log('send fail');
                return;
              }
              console.log('send success');
            })

            let messageView = '';
            tcp.on('message', (value: socket.SocketMessageInfo) => {
              for (let i: number = 0; i < value.message.byteLength; i++) {
                let uint8Array = new Uint8Array(value.message)
                let messages = uint8Array[i]
                let message = String.fromCharCode(messages);
                messageView += message;
              }
              console.log('on message message: ' + JSON.stringify(messageView));
              console.log('remoteInfo: ' + JSON.stringify(value.remoteInfo));
            });
          })
        })
    }
    .height('100%')
    .width('100%')
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进