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

时间:2018-06-02 11:59:52

标签: android sockets tcp nodemcu

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

当NodeMCU的套接字断开连接时,我无法找到一种方法(我认为可靠)让Android的ServerSocket立即注意到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);
    }
}

1 个答案:

答案 0 :(得分:1)

你应该把所有代码放在

之后
socket = serverSocket.accept();

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

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