ESP32与java本地服务器的套接字通信

2024-06-01 07:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在ESP32作为客户端和运行在Windows PC上的Java服务器之间设置一个简单的通信

我为服务器编写了以下python代码:

import socket
 
s = socket.socket()         
 
s.bind(('192.168.1.246', 8090 ))
s.listen(0)                 
 
while True:
 
    client, addr = s.accept()
 
    while True:
        content = client.recv(32)
 
        if len(content) ==0:
           break
 
        else:
            print(content)
 
    print("Closing connection")
    client.close()

但是我的整个软件都是用java编写的,所以我需要用java编写类似的东西。 以下是我的服务器Java代码:

Thread serverThread = new Thread(new Runnable() {
            @Override
            public void run() {
                try{  
                    ss = new ServerSocket(8090);
                    s = ss.accept();
                    
                    din = new DataInputStream(s.getInputStream()); 
                    dout = new DataOutputStream(s.getOutputStream());  

                    clientMessage = (String) din.readUTF();
                    while(!clientMessage.equals("stop")){  
                        
                        clientMessage = din.readUTF();
                        serverMessage = "This is the message from the server";
                        dout.writeUTF(serverMessage);
                        dout.flush();  
                    } 
                    din.close();  
                    s.close();  
                    ss.close();
                }catch(Exception e){
                    e.printStackTrace();
                    //System.out.println(e);
                }
            }
        });
        serverThread.start();

我的ESP32的Arduino代码是:

include <WiFi.h>
 
const char* ssid = "myssid";
const char* password =  "mywifipass";
 
const uint16_t port = 8090;
const char * host = "192.168.1.246";
 
void setup()
{
 
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("...");
  }
 
  Serial.print("WiFi connected with IP: ");
  Serial.println(WiFi.localIP());
 
}
 
void loop()
{
    WiFiClient client;
 
    if (!client.connect(host, port)) {  
 
        Serial.println("Connection to host failed");
 
        delay(1000);
        return;
    }
 
    Serial.println("Connected to server successful!");
 
    client.print("Hello from ESP32!"); 
 
    Serial.println("Disconnecting...");
    client.stop();
 
    delay(10000);
}

如果我使用python服务器,一切都很好,但如果我使用Java服务器,我可以在它们之间建立连接,并在服务器行中获得EOFExcepion:

clientMessage = (String) din.readUTF();

readUTF()API的说明如下:

Throws:EOFException - if this input stream reaches the end before reading all the bytes.

那么,这里发生了什么,我该如何解决


Tags: the服务器clientnewcloseserialwifiprint
1条回答
网友
1楼 · 发布于 2024-06-01 07:25:54

我解决了这个问题

clientMessage = (String) din.readUTF();

与:

byte[] myMessage = din.readAllBytes();

clientMessage = translate(myMessage);

其中translate()函数为:

private static String translate(byte[] word)
{      
    String translatedMessage = "";
    for(int i=0; i<word.length; i++) {
        translatedMessage = translatedMessage + (char) word[i];
    }
    
    return translatedMessage;
}

相关问题 更多 >