Я пытаюсь реализовать тест UDP, чтобы узнать об этом. У меня есть серверное приложение в C# для windows и клиентское приложение для Android.Странное поведение с дейтаграммой в функции приема UDP в Android
Я пытаюсь внедрить услугу самообслуживания. Сервер постоянно прослушивает пакеты UDP с фиксированной строкой («LazyRemote»). Когда он получает эту строку, он отправляет клиенту другую строку («LazyRemote_192.168.1.17: 2016») Я проверил с помощью wirehark, что данные, отправленные в обоих направлениях, верны, но я получаю что-то неправильное в клиентском приложении ,
Код для Android заключается в следующем:
buttonConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
progress.show();
//This code is executed when user clicks connect button. As it could be a long running operation, it's executed in a new thread to avoid blocking UI
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
String ipAddress = "";
SocketClass my_socketClass = new SocketClass();
InetAddress UDPaddress = my_socketClass.getBroadcastAddress();
int UDPport = 15000;
if(initializationDone == false){
initializationDone = true;
try {
socket_send = new DatagramSocket();
socket_send.setBroadcast(true);
socket_send.setSoTimeout(6000);
socket_receive = new DatagramSocket(UDPport, InetAddress.getByName("0.0.0.0"));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
byte[] send_buff = "LazyRemote".getBytes();
DatagramPacket sendPacket = new DatagramPacket(send_buff, send_buff.length,UDPaddress,UDPport);
socket_send.send(sendPacket);
}catch (Exception ex){
showToast("Imposible enviar primer ack");
}
byte[] receive_buff = new byte[30];
DatagramPacket receivePacket = new DatagramPacket(receive_buff, receive_buff.length);
try {
socket_receive.receive(receivePacket);
String receivedData = new String(receivePacket.getData(), "UTF-8");
if (receivedData.contains("LazyRemote")) {
SocketClass my_socket = new SocketClass(receivePacket.getAddress().toString().substring(1), 2016);
SocketClass.ConnectionStatus connectionStatus = my_socket.establishConnection();
//Remove progressdialog after establishConnection finishes.
progress.dismiss();
//Check connection status.
if (connectionStatus.status == true) {
Thread.sleep(1000);
socket_receive.close();
socket_send.close();
Intent intent = new Intent(MainActivity.this, ActionPerformer.class);
startActivity(intent);
finish();
}
}
} catch (Exception ex) {
progress.dismiss();
showToast("No se han encontrado servidores");
}
//mLock.release();
}
});
thread.start();
}
});
Проблема заключается в том, что получить функция работает, но он получает неверные данные. (Он получает ту же строку, что клиент отправляет серверу для инициализации обнаружения («LazyRemote»)).
Это должна быть глупая ошибка, но я не могу ее решить. Большое спасибо.
Возможный дубликат [Полученное сообщение UDP имеет неправильную длину] (http://stackoverflow.com/questions/36533359/received-udp-message-has-incorrect-length) – EJP
Проблема не в длине. Я получаю то, что не отправляется. Я думаю, что что-то связано с буферами, но я не могу его найти. – Aldridge1991