如何从充当 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 :)
我正在制作一个 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 :)