服务器套接字不读取 esp8266,为什么?
server socket not reading esp8266, why?
我对 Android
和 esp8266
之间的简单套接字的概念验证只完成了 50%。
我从 Android
发送一条消息到 esp8266
,它被正常接收,但是从 esp8266 到 android 不是,并且在 android 端有 java.io.EOFException
和 Timeout
(如下面的代码所示)用于 esp8266 端。
我提供代码的相关部分是简短的,如果需要我会 post all.
Android:
while (true) {
socket = serverSocket.accept();
dataInputStream = new DataInputStream(
socket.getInputStream());
dataOutputStream = new DataOutputStream(
socket.getOutputStream());
String msgReply = "Android server is alive!";
dataOutputStream.writeUTF(msgReply);
dataOutputStream.flush();
message = dataInputStream.readUTF();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
msg.setText(message);
}
});
}
ESP8266端:
String cmd = "Hello from NodeMCU";
Serial.print("send to server: ");
Serial.println(cmd);
client.print(cmd);
client.flush();
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
while(client.available()){
String line = client.readStringUntil('!');
Serial.print(line);
}
我已经尝试了我想到的任何方法,切换到使用 client.write('h')
编写 char 等等,但没有任何效果。
请指出一些工作方向。
dataOutputStream.writeUTF(msgReply);
message = dataInputStream.readUTF();
不使用 UTF 函数。
最好使用普通的 write() 和 read();
此外,您可以更好地编写阅读行。 (“\n”作为 line/message 结束。不是“!”)。
在 Android 方面,您可以使用 writeLine() 和 readLine() 函数,这让生活变得更加轻松。
进一步:服务器先发送消息,然后尝试读取答案。但客户端也先发送消息,然后尝试读取答案。那永远行不通。你应该决定哪一个先发消息。
您必须或者在两端使用readUTF()
和writeUTF()
或者根本不使用它们:使用 read()
和 write()
,或 readLine()
和 println()
,等等。你不能像这样混淆它们。
我对 Android
和 esp8266
之间的简单套接字的概念验证只完成了 50%。
我从 Android
发送一条消息到 esp8266
,它被正常接收,但是从 esp8266 到 android 不是,并且在 android 端有 java.io.EOFException
和 Timeout
(如下面的代码所示)用于 esp8266 端。
我提供代码的相关部分是简短的,如果需要我会 post all.
Android:
while (true) {
socket = serverSocket.accept();
dataInputStream = new DataInputStream(
socket.getInputStream());
dataOutputStream = new DataOutputStream(
socket.getOutputStream());
String msgReply = "Android server is alive!";
dataOutputStream.writeUTF(msgReply);
dataOutputStream.flush();
message = dataInputStream.readUTF();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
msg.setText(message);
}
});
}
ESP8266端:
String cmd = "Hello from NodeMCU";
Serial.print("send to server: ");
Serial.println(cmd);
client.print(cmd);
client.flush();
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
}
while(client.available()){
String line = client.readStringUntil('!');
Serial.print(line);
}
我已经尝试了我想到的任何方法,切换到使用 client.write('h')
编写 char 等等,但没有任何效果。
请指出一些工作方向。
dataOutputStream.writeUTF(msgReply);
message = dataInputStream.readUTF();
不使用 UTF 函数。
最好使用普通的 write() 和 read();
此外,您可以更好地编写阅读行。 (“\n”作为 line/message 结束。不是“!”)。
在 Android 方面,您可以使用 writeLine() 和 readLine() 函数,这让生活变得更加轻松。
进一步:服务器先发送消息,然后尝试读取答案。但客户端也先发送消息,然后尝试读取答案。那永远行不通。你应该决定哪一个先发消息。
您必须或者在两端使用readUTF()
和writeUTF()
或者根本不使用它们:使用 read()
和 write()
,或 readLine()
和 println()
,等等。你不能像这样混淆它们。