DatagramPacket正在累积值

时间:2017-05-01 22:18:56

标签: java runnable datagram

我在Java中创建了一个聊天,它显示了在屏幕上发送和接收的消息。问题是,在发送消息时,它正在获取先前发送的值。例如,我发送了#34; Microsoft"所写的消息,然后我发送另一条消息#34; Apple",当显示屏显示" Applesoft"时,它似乎是没有清空DatagramPacket。可以做些什么?

    class Recebe implements Runnable {

        @Override
        public void run() {
            byte[] dadosReceber = new byte[255];
            boolean erro = false;
            DatagramSocket socket = null;
            while (true) {
                try {
                    socket = new DatagramSocket(getPorta());
                } catch (SocketException ex) {
                    Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
                }
                erro = false;
                while (!erro) {
                    DatagramPacket pacoteRecebido = new DatagramPacket(dadosReceber, dadosReceber.length);
                    try {
                        socket.receive(pacoteRecebido);
                        byte[] b = pacoteRecebido.getData();
                        String s = "";
                        for (int i = 0; i < b.length; i++) {
                            if (b[i] != 0) {
                                s += (char) b[i];
                                System.out.println("Valor S: " + s + " ");
                            }
                        }

//                        if (!s.equals(new GeraHash().MD5("envie a chave publica!!!"))) {
                            String nome = pacoteRecebido.getAddress().toString() + " disse:";
                            notifica(nome + s);
                            System.out.println("Dados Recebe 2: " + s + " ");
//                        } else {
//                            conexaoAtual().envia("Funcionou!");
//                            System.out.println("Dados Recebe 1: " + s + " ");
//                        }

                    } catch (Exception e) {
                        System.out.println("erro");
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        erro = true;
                        continue;
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

socket.receive(pacoteRecebido);
byte[] b = pacoteRecebido.getData();
String s = "";
for (int i = 0; i < b.length; i++) {
if (b[i] != 0) {
    s += (char) b[i];
    System.out.println("Valor S: " + s + " ");
}

常见问题。您忽略了DatagramPacket.getLength()给出的接收数据报的实际长度。您可以将所有内容减少到:

socket.receive(pacoteRecebido);
System.out.println(new String(pacoteRecebido.getData(), 0, pacoteRecebido.getLength());