【发布时间】:2018-05-31 14:42:35
【问题描述】:
我对@987654321@ 和esp8266 之间的简单套接字的概念证明只工作了50%。
我从Android 向esp8266 发送了一条消息,该消息正常接收,但从esp8266 到android 不是,并以java.io.EOFException 在android 端和Timeout 结束(如下面的代码所示)用于esp8266 .
我提供的代码的相关部分是简短的,如果需要我会全部发布。
安卓:
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') 等编写字符,但没有任何效果。
请指出一些工作方向。
【问题讨论】:
-
I send one message from Android to esp8266, which is received normally,。难以置信。因为前导 utf 字节会给你一个损坏的字符串。 -
您知道这一点:您的服务器发送了一条消息。然后(尝试)读取消息并转储客户端。它将等待另一个客户端连接。这是你想要的吗?
-
如果您决定使用线条,
client.print(cmd);应该是client.print(cmd + "\n");。 -
“你知道的”——老实说,不是真的!我对自己正在做的事情的了解是如此有限,事实上我现在正在边做边学,带着这个简单的项目开始学习套接字。所以你的意思是“dataInputStream.readUTF()”会转储客户端,你能澄清一下吗?这一切意味着,为了在 1 次读取操作后不丢弃客户端,我必须简单地带上“socket = serverSocket.accept();”真的,对吗?另外,我不能投票接受的答案,我希望,你能编辑并保存,所以我投票吗? (当我尝试“仅当它被编辑”时它会抱怨)