Я могу отправить и получить udp, проблема, с которой я столкнулся сейчас, заключается в том, что когда мне нужно автоматизировать c отправка данных с клиента на сервер (чтобы доказать, что клиент жив), сервер не может получить данные , но когда я посылаю живой статус через событие Button. это сработало. вот мой код
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
establishConnection();
/* Working */
Button send = new Button(this);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
DatagramPacket receivePacket = null;
byte[] command = (room+":Alive").getBytes();
try {
receivePacket = new DatagramPacket(command, command.length, InetAddress.getByName(UrlColletion.hostAddress), 8084);
} catch (UnknownHostException e) {
e.printStackTrace();
}
java.lang.System.out.println("Sending");
try {
serverSocket1.send(receivePacket);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
/* Not Working*/
final Handler handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
DatagramPacket receivePacket = null;
byte[] command = (room + ":Alive").getBytes();
try {
receivePacket = new DatagramPacket(command, command.length, InetAddress.getByName(UrlColletion.hostAddress), 8084);
} catch (UnknownHostException e) {
e.printStackTrace();
}
java.lang.System.out.println("Sending");
try {
serverSocket1.send(receivePacket);
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
// TODO: handle exception
} finally {
//also call the same runnable to call it at regular interval
handler.postDelayed(this, 5000);
}
}
};
handler.post(runnable);
setContentView(send);
}
DatagramSocket serverSocket1;
void establishConnection(){
try {
serverSocket1 = new DatagramSocket(7070);
serverSocket1.setReuseAddress(true);
} catch (SocketException e) {
e.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
boolean isOpen = true;
while(isOpen) {
byte []message = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(message, 1024);
try {
serverSocket1.receive(receivePacket);
} catch (IOException e) {
e.printStackTrace();
}
String text = new String(message, 0, receivePacket.getLength());
System.out.println(text);
}
serverSocket1.close();
}
}).start();
}
код выше проверен. когда он отправляет через обработчик, сервер не может получить никаких данных, а кнопка - может. Дополнительная информация, код работает на эмуляторе, но когда он приходит на телефон, проблема выходит. это значит, что на эмуляторе успешно отправляется UDP, но на телефоне, нет .