用例: 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);
}
}
答案 0 :(得分:1)
你应该把所有代码放在
之后socket = serverSocket.accept();
在一个所谓的客户端线程中。这通常是为了一次处理更多客户端。
服务器然后立即等待下一个客户端连接。