Всегда могу получить первый пакет udp, но когда я получу второй пакет udp, DatagramPacket
всегда будет частью последнего пакета.Сокет всегда получает последний принятый пакет udp
, например: мне нужно получить в первом пакете: "AAAAAAAAAA" я получаю: "AAAAAAAAAA"
Мне нужно получить во втором пакете: "BBBB" Я получаю: "BBBBAAAA".
Как я могу очистить, стереть или другой способ решить мою проблему?
Вот мой код:
public DatagramServer(Context c, Activity a) throws SocketException {
setSocket(new DatagramSocket(Constantes.UDP_PORT));
getSocket().setBroadcast(true);
getSocket().setReuseAddress(true);
setContext(c);
setActivity(a);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
receivePacket();
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
}
public void receivePacket() throws IOException {
byte[] buf = null;
buf = new byte[Constantes.PACKETSIZE];
final DatagramPacket packet = new DatagramPacket(buf, buf.length);
while (true) {
getSocket().receive(packet);
Handler mainHandler = new Handler(getContext().getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
byte[] resposta = packet.getData();
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
if (resposta[0] == 111) {
if (GlobalSingleton.getInstance().is_pode_reconhecer_central()){
final CentralDAO cDAO = new CentralDAO(getContext());
final Central central = new Central();
Central centralExistente = new Central();
Boolean bcentralExiste = false;
central.set_IP(packet.getAddress().getHostAddress());
central.set_mac(CentralService.getMAC(packet.getData()));
central.set_modificado(true);
central.set_ativo(true);
}
else {
centralExistente.set_IP(packet.getAddress().getHostAddress());
centralExistente.set_ativo(true);
for (int i=0;i<lvCentrais.getCount();i++){
Central centrallv = (Central) lvCentrais.getItemAtPosition(i);
if (centrallv.get_mac().equals(centralExistente.get_mac())){
centrallv.set_IP(centralExistente.get_IP());
centrallv.set_ativo(centralExistente.is_ativo());
}
}
}
GlobalSingleton.getInstance().set_pode_reconhecer_central(false);
}
} else {
String respostaString = "";
try {
respostaString = new String(packet.getData(),"ASCII");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}//new String(packet.getData(),packet.getOffset(),packet.getLength());//
if (respostaString.toUpperCase().contains(Constantes.ANSWER_DEVICE)) {
if (GlobalSingleton.getInstance().is_pode_reconhecer_dispositivo()){
final GeradorDAO gerDAO = new GeradorDAO(getContext());
final DispositivoDAO dDAO = new DispositivoDAO(getContext());
List<Gerador> list = gerDAO.selectAll();
if (list.size()>0){
int mac,versao,tipo;
String values[] = Utils.getValorString(respostaString, Constantes.P_COMA, Constantes.P_INDICADOR);
mac = Integer.parseInt(values[0].trim());
tipo = Integer.parseInt(values[1].trim());
versao = Integer.parseInt(values[2].trim());
if (dDAO.selectOne(mac, GlobalSingleton.getInstance().get_current_central().get_id()) == null){
final Gerador gerador = gerDAO.selectOne(tipo, versao);
final Dispositivo dispNovo = new Dispositivo(GlobalSingleton.getInstance().get_current_central().get_id());
dispNovo.set_mac(mac);
dispNovo.set_tipo(tipo);
dispNovo.set_versao(versao);
dispNovo.set_nome(gerador.get_nome_dispositivo());
}
else{
Toast.makeText(getContext(), "Dispositivo já existe", Toast.LENGTH_SHORT).show();
}
}
GlobalSingleton.getInstance().set_pode_reconhecer_dispositivo(false);
}
}
}
}
};
mainHandler.post(myRunnable);
}
}
Я новичок в Android, пожалуйста, если вы можете помочь мне, я буду благодарен!
Хорошо, но, central.set_mac («») запустить в первом пакете. Во втором пакете выполните следующее: dispNovo.set_versao (versao); и он получает первую строку. Ты понимаешь? –
Неприменимо. В вашем вопросе говорится, что вы получаете часть первой дейтаграммы в конце второй дейтаграммы, и я сказал вам, почему. Не используйте только массив байтов, с которым вы создали дейтаграмму, используйте его смещение и длину. – EJP
Хорошо. Я попробовал свой ответ в 'respostaString' var, но' respostaString' пуст (""), когда я использую respostaString = new String (packet.getData(), packet.getOffset(), packet.getLength(), "ASCII") ; –