如何使这个 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();
在所谓的客户端线程中。这通常是为了一次处理更多的客户。
服务器然后立即等待下一个客户端连接。
用例: 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();
在所谓的客户端线程中。这通常是为了一次处理更多的客户。
服务器然后立即等待下一个客户端连接。