微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ESP32与java本地服务器的Socket通信

如何解决ESP32与java本地服务器的Socket通信

我正在尝试在作为客户端的 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 说:

抛出:EOFException - 如果此输入流到达末尾 在读取所有字节之前。

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

解决方法

我解决了更换问题

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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。