在java中,一个服务器从Server套接字中发送一个字节数组,这个字节数组包含文本(utf-8),格式如下。
所以我使用 "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(客户端)代码接收并解释字节数组(该代码的目的是将字节转化为一个字符串)。
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或 "字母 "转换成char。因为我通常会发送一个已知长度的消息,开头是一个char,我读取我的消息的每一个字节,并将其转换为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;
}