gpt4 book ai didi

android - 套接字总是收到最后一个 udp 数据包

转载 作者:行者123 更新时间:2023-11-30 02:14:13 25 4
gpt4 key购买 nike

我总是可以获得第一个 udp 数据包,但是当我将收到第二个 udp 数据包时,DatagramPacket 总是获得最后一个数据包的一部分。

例如:我需要收到第一个数据包:“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的初学者,如果你能帮助我,我将不胜感激!

最佳答案

您忽略了 DatagramPacket 中的长度。

central.set_mac(CentralService.getMAC(packet.getData()))

应该是这样的

central.set_mac(CentralService.getMAC(packet.getData(), packet.getOffset(), packet.getLength()))

假设 getMac() 方法接受这些参数。否则,您将不得不自己创建一个适当大小的字节数组。

编辑 我不打算针对 packet.getData() 的所有其他用途重复这一点。

关于android - 套接字总是收到最后一个 udp 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com