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

时间:2018-01-23 21:56:35

标签: java android multithreading datagram

我正在制作一个从Arduino接收消息的Android应用程序,我实现了一个打开一个Thread的UDP服务器,但我无法获得答案字符串“lastMessage”的值,因为有了这个值,我将制作一系列动作。

这是我的课程_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;
    }
}

这个课我是从我的MainActivity的onCreate实现的:

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

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

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

我等待你的帮助,先谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

编辑:另一个答案是对的!

好的,我认为你在创建新服务器时有问题...()...

你可以试试这个:

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

你正在做新服务器();所以我要创建一个新对象,你应该像我一样将它保存在类变量中,然后在服务器类中创建一个get方法......

PD:Intenta no hacer codigo en castellano:)