Arduino (c++),如何从套接字 (WiFiClient) 读取字节?

Arduino (c++), How to read bytes from Sockets (WiFiClient)?

java 中的服务器从服务器套接字发送一个字节数组,该字节数组包含具有以下格式的文本 (utf-8):

  1. 前 4 个字节:一个包含文本字节数的 int
  2. 下一个 bytes: 每个字节代表一个字符。

所以我正在使用 "ESP8266WiFi.h" 库中的 "WiFiClient"(它应该与 "WiFi.h" 库相同),WifiClient 有一个使用 read() 接收字节的方法方法,问题是我无法正确读取 int(前四个字节)或将字节转换为 int 值。所以如果你能帮助我,我将非常感激:

Java(服务器)简化代码:

String respuestaServer="RESPUESTAS DEL SERVER";
DataOutputStream out=new DataOutputStream(sock.getOutputStream());
out.writeInt(respuestaServer.getBytes(StandardCharsets.UTF_8).length);
out.write(respuestaServer.getBytes(StandardCharsets.UTF_8));
out.flush();

用于接收和解释字节数组的Arduino(客户端)代码(此代码的objective是将字节转换为字符串):

String recibirInfo() {
  //TRYING TO READ FIRST FOUR BYTES
  byte bytesSizeMsj[4];
  for (int i = 0; i < sizeof(bytesSizeMsj); i++) {
    bytesSizeMsj[i] = client.read();
    Serial.print("BYTE: "+bytesSizeMsj[i]);
  }
  //TRYING TO TRANSFORM THE FOUR BYTES INTO AN INT
  int sizeMsj = int((unsigned char)(bytesSizeMsj[0]) |
            (unsigned char)(bytesSizeMsj[1]) |
            (unsigned char)(bytesSizeMsj[2])|
            (unsigned char)(bytesSizeMsj[3]));
  Serial.println(sizeMsj);
  char charArray[sizeMsj];
  //TRYING TO READ THE REST OF THE MESSAGE
  for (int i = 0; i < sizeof(charArray); i++) {
    charArray[i] = client.read();
  }
  //TRYING TO TRANSFORM THE BYTE ARRAY INTO A STRING
  String msj=charArray;
  return msj;
}

这样排查有点难,你真的收到数据了吗?你能展示你得到的输出吗?也许你甚至没有连接。

此外,我过去所做的是将每个 int 或 "letter" 转换为 char。因为我通常发送一条以字符开头的已知长度的消息,所以我读取消息的每个字节并将其转换为字符,然后将其添加到我收到的消息字符串中。我不知道这是否有帮助...基本上我在字节到达时进行转换。

我修复了它,我在从套接字读取的方式、将 4 个字节转换为 Int 数据类型的方式以及将字节转换为字符串的方式方面遇到了问题,我明白了为什么我是尝试从套接字读取时没有收到所有字节,原因是当我调用方法 "client.read()" 时,服务器发送信息的速度不够快,所以它没有读取任何内容,所以我做了一个循环并在方法 "client.available()" 的帮助下,我检查了是否有一个字节可供读取,因此当读取前 4 个字节时循环结束。然后我将读取的 4 个字节转换为 Int,以与之前类似的方式读取其余字节,并将字节转换为 String。

这是我的功能代码:

String recibirInfo(bool* error) {
  String msj = "";
  byte bytesSizeMsj[4];
  for (int i = 0; i < sizeof(bytesSizeMsj); i++) {
    if (client.connected()) {
      if (client.available()) {
        bytesSizeMsj[i] = client.read();
      } else {
        delay(10);
        i--;
      }
    } else {
      *error = true;
      return "";
    }
  }
  //TRANSFORMAR LOS 4 BYTES A INT
  int sizeMsj = 0;
  sizeMsj = ((int)bytesSizeMsj[3]) | sizeMsj;
  sizeMsj = ((int)bytesSizeMsj[2]) << 8 | sizeMsj;
  sizeMsj = ((int)bytesSizeMsj[1]) << 16 | sizeMsj;
  sizeMsj = ((int)bytesSizeMsj[0]) << 24 | sizeMsj;

  char charArray[sizeMsj];
  //LEER EL TEXTO
  for (int i = 0; i < sizeof(charArray); i++) {
    if (client.connected()) {
      if (client.available()) {
        charArray[i] = client.read();
      } else {
        delay(250);
        i--;
      }
    } else {
      *error = true;
      return "";
    }
  }
  //TRANSFORMAR BYTES A STRING
  msj = charArrayToString(charArray, sizeMsj);
  Serial.print("RECIBIDO: ");
  Serial.println(msj);
  return msj;
}

String charArrayToString(char arrChar[], int tam) {
  String s = "";
  for (int i = 0; i < tam; i++) {
    s = s + arrChar[i];
  }
  return s;
}