【问题标题】:server socket not reading esp8266, why?服务器套接字不读取 esp8266,为什么?
【发布时间】:2018-05-31 14:42:35
【问题描述】:

我对@9​​87654321@ 和esp8266 之间的简单套接字的概念证明只工作了50%。 我从Androidesp8266 发送了一条消息,该消息正常接收,但从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();”真的,对吗?另外,我不能投票接受的答案,我希望,你能编辑并保存,所以我投票吗? (当我尝试“仅当它被编辑”时它会抱怨)

标签: android sockets nodemcu


【解决方案1】:

你必须要么在两端使用readUTF()writeUTF()或者根本不使用它们:使用read()write(),或者@987654325 @ 和println() 等,不能这样混在一起。

【讨论】:

    【解决方案2】:

    dataOutputStream.writeUTF(msgReply);

    message = dataInputStream.readUTF();

    不要使用 UTF 函数。

    最好使用普通的write()和read();

    此外,您可以更好地编写读取行。 (“\n”作为行/消息结束。不是“!”)。

    在 Android 端,您可以使用 writeLine() 和 readLine() 函数,这让生活变得更加轻松。

    进一步:服务器首先发送消息,然后尝试读取答案。但是客户端也会先发送一条消息,然后尝试读取答案。那永远行不通。您应该决定哪个先发送消息。

    【讨论】:

    • 谢谢,我在 android 端退出了 readUTF() (并应用了其他建议),现在一切正常。使用 readUTF() 的 BufferedReader 和 InputStreamReader 插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2019-04-21
    • 2017-10-05
    相关资源
    最近更新 更多