如何使这个 Android NodeMCU TCP 套接字代码自动重新连接?

How make this Android NodeMCU TCP socket code auto-reconnect?

用例: NodeMCU 通过 TCP 套接字连接到 Android,然后当用户按下连接到 NodeMCU 的按钮时,Android 播放声音。

我找不到一种方法(我相信它是可靠的)让 Android 的 ServerSocket 在 NodeMCU 的套接字断开连接时立即注意到来自 NodeMCU 客户端套接字的重置,或者正在尝试重新连接。

下面是我的 newbee 套接字代码,我也是在这个论坛的帮助下让它工作的。在这里发帖的时候尽量写的短一些,只保留相关的部分,但是如果你需要我可以把所有的代码都去掉,所以请让我知道以防万一。

请给我一个方法。非常欢迎任何其他有助于我了解更多套接字的评论。

我终于想知道套接字是什么了!

public class MainActivity extends AppCompatActivity {
ServerSocket serverSocket;
Thread socketServerThread = null;

protected void onCreate(Bundle savedInstanceState) {
    //...
    Globals.snd = MediaPlayer.create(this, R.raw.bike_horn);// Globals - static class
    //...
    socketServerThread = new Thread(new SocketServerThread());
    socketServerThread.start();
}
protected void onDestroy() {
    if (serverSocket != null) {...//try close it}
}
private class SocketServerThread extends Thread {
    //...
    static final int SocketServerPORT = 8080;
    public void run() {
        Socket socket = null;
        DataInputStream dataInputStream = null;
        DataOutputStream dataOutputStream = null;
        BufferedReader input = null;
        try {
            serverSocket = new ServerSocket();
            serverSocket.setReuseAddress(true);
            serverSocket.bind(new InetSocketAddress(SocketServerPORT));
            while (true) {
                socket = serverSocket.accept();
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                while(socket.isConnected()){
                    input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    message = input.readLine();
                    if(message == null) break;
                    int x = Integer.valueOf(message);
                    if(x == 1) Globals.snd.start();
                }
            }
        }catch (IOException e) {// print error stack
        }finally{//close socket, dataInputStream, dataOutputStream
        }

NodeMCU 代码:

#include <ESP8266WiFi.h>
//...variables defined
void setup() {
    //...connect to wifi
    client.connect(host, port);
}
void loop() {
    if(!client.connected()){
        if (!client.connect(host, port)) {
            return;
        }
    }

    while(digitalRead(beepBtnPin) == LOW && client.connected()){
        client.println("2");
        client.flush();
        delay(500);
    }
}

您应该将所有代码放在

之后
socket = serverSocket.accept();

在所谓的客户端线程中。这通常是为了一次处理更多的客户。

服务器然后立即等待下一个客户端连接。