2015-05-03 2 views
0

У меня есть следующий код, чтобы принимать пакеты UDP:сервер Android UDP не получает пакеты

public class AsyncReceiveUdp2 extends AsyncTask<String, Void, Boolean> { 
@Override 
protected Boolean doInBackground(String... f_url) { 
    int udp=111; 
    byte[] packet = new byte[2000]; 
    DatagramPacket dp = new DatagramPacket(packet, packet.length); 
    DatagramSocket ds = null; 
    try { 
     ds = new DatagramSocket(udp); 
     ds.receive(dp); 
     //... 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (ds != null) { 
      ds.close(); 
     } 
    } 
    return null; 
} 

}

я отправить UDP данные на компьютер с Android устройства. Компьютер немедленно отправляет ответ как пакет UDP. Я сохраняю информацию в своем файле журнала на SD. И я вижу, что мое приложение остается на линии «ds.receive (dp)»; и не запускается после него. Я протестировал Android-устройство против программы на компьютере. Как я понимаю, сложно получить UDP-пакеты в эмуляторе. Я не мог этого сделать. Перенаправление не работает для меня, как описано here

Еще одна важная проблема - получить все пакеты, отправленные на устройство. Lossless. Как изменить код для этого?

Пожалуйста, помогите! Благодаря!

+0

UDP не является протоколом без потерь, с помощью TCP .. он проверяет, был ли принят пакет, а также его целостность с 32-битной CRC –

+0

протокол, который я работаю с является UDP протокол. Нет шансов на выбор. Благодарю. – Niaz

+0

Хорошо, но вы не можете быть уверены, что пакет будет получен. В этом разница между UDP и TCP. UDP быстрее, потому что вы не проверяете, был ли получен пакет. TCP обрабатывает, в том числе, когда неверно сформирован пакет (ошибка CRC) –

ответ

0

наденьте ваш прием внутри (правда) петли. Когда вы получаете пакетный вызов if (pkg_received) {break;} ... или все, что вы хотите сделать ... Проблема в том, что вы, вероятно, получаете только один пакет, и вы получаете тайм-аут перед его получением.

Код редактируются и не тестируется

while(true) 
    { 


     byte[] message = new byte[60*1024]; 
     DatagramPacket recv_packet = new DatagramPacket(message, message.length); 


     try { 
      socket.receive(recv_packet); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Log.d("UDP", "S: Receiving...listening on port " + recv_packet.getPort()); 
     String rec_str; 
     rec_str=new String(recv_packet.getData) 

     Log.d("PACKAGE LENGTH",Integer.toString(recv_packet.getLength())); 
} 
Смежные вопросы