如何从充当 UDP 服务器的线程中获取数据?

How can I get the data from a thread that acts as a UDP server?

我正在制作一个 Android 应用程序来接收来自 Arduino 的消息,我实现了一个打开线程的 UDP 服务器,但我无法获得答案字符串的值 "lastMessage",因为这个值我会做一系列的动作。

这是我的 class served_UDP:

public class Servidor_UDP {
    private boolean server_activado = true;
    private String lastMessage = "";
    DatagramSocket socket;
    private byte[] resp;
    private DatagramPacket pqtResp;
    Servidor_UDP()
    {
        resp = new byte[1024];
        try {
            socket = new DatagramSocket(6000);
            pqtResp = new DatagramPacket(resp, resp.length);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    public void start(){
        Thread t = new Thread(new server());
        t.start();
    }

    public class server implements Runnable {
        server() { run(); }
        public void run() {
            String message = "";
            try {
                do
                {
                    socket.receive(pqtResp);
                    //message = new String(resp).trim();
                    message = new String(pqtResp.getData(),0,pqtResp.getLength());
                    lastMessage = message;
                } while(server_activado);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public String getString() 
    {
        return lastMessage;
    }

    public void setServer(boolean b)
    {
        server_activado = b;
    }
}

这个 class 我从 MainActivity 的 onCreate 实现的:

Servidor_UDP UDP_S;
UDP_S = new Servidor_UDP();
UDP_S.start();

我尝试获取主要方法的结果 class 并将它们显示在 TextView 中以确保消息到达,但它没有显示任何内容,只是空的。

public void actualizarUI()
{
    respuesta = UDP_S.getString();
    txt.setText(respuesta);
}

我等待你的帮助,在此先感谢。

您的 server() 构造函数不应调用 run()Thread.start() 会那样做。目前 Thread.start() 永远不会执行,更不用说完成了,所以任何调用您的 start() 方法的代码都不会 return.

编辑:另一个答案是正确的!

好的,我认为您在创建新服务器时遇到了问题()...

你可以试试这个:

private server server;
public void start(){
    server = new server();
    Thread t = new Thread(server);
    t.start();
}

public class server implements Runnable {
    server() { /*NO run();*/ }
    public void run() {
        String message = "";
        try {
            do
            {
                socket.receive(pqtResp);
                //message = new String(resp).trim();
                message = new String(pqtResp.getData(),0,pqtResp.getLength());
                lastMessage = message;
            } while(server_activado);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getLastMessage() {
        return lastMessage;
    }
}

public String getString()
{
    return server.getLastMessage();
}

你正在做 new server();所以我正在创建一个新对象,您应该像我一样将它保存在 class 变量中,然后在服务器 class...

中创建一个 get 方法

PD: Intenta no hacer codigo en castellano :)