2016-04-24 3 views
0

Hallo Ich mache einen Chat mit Java mit internen IP-Netzwerk, aber ich habe einen Fehler nach dem Senden einiger Nachrichten das Programm diese vorherige Nachrichten mischen mit dem neu gesendet und kann nicht finden, warum. folgt dem Code.Java Socket vorherige Nachrichten letzte Beiträge mischen

Conexao.java

public class Conexao erweitert Observable {

private String ip; 
private int porta; 
private String mensagem; 

public Conexao(String ip, int porta) { 
    this.ip = ip; 
    this.porta = porta; 
    new Thread(new Recebe()).start(); 
} 

public String getMensagem() { 
    return mensagem; 
} 

public String getIp() { 
    return ip; 
} 

public int getPorta() { 
    return porta; 
} 

public void envia(String texto) { 
    new Thread(new Envia(texto)).start();  
} 

public void notifica(String mensagem) { 
    this.mensagem = mensagem; 
    setChanged(); 
    notifyObservers(); 
} 

class Recebe implements Runnable { 

    byte[] dadosReceber = new byte[65508]; 
    boolean erro = false; 
    DatagramSocket socket = null; 

    @Override 
    public void run() { 
     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); 
        socket.getReceiveBufferSize(); 
        byte[] b = pacoteRecebido.getData(); 
        String s = ""; 
        for (int i = 0; i < b.length; i++) { 
         if (b[i] != 0) { 
          s += (char) b[i]; 
         } 
        } 

        String nome = pacoteRecebido.getAddress().toString() + " disse:"; 
        notifica(nome + 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; 
       } 
      } 
     } 
    } 
} 

class Envia implements Runnable { 

    String texto; 

    public Envia(String texto) { 
     this.texto = texto; 
    } 

    @Override 
    public void run() { 

     byte[] dados = texto.getBytes(); 

     try { 
      DatagramSocket clientSocket = new DatagramSocket(); 
      InetAddress addr = InetAddress.getByName(getIp());    
      DatagramPacket pacote = new DatagramPacket(dados, dados.length, addr, getPorta()); 
      clientSocket.send(pacote); 
      clientSocket.close(); 
     } catch (SocketException ex) { 
      Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (UnknownHostException ex) { 
      Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

}

JanelaChat.java

public class JanelaChat erweitert javax.swing.JFrame implementiert Observer {

private Conexao conexao; 

public JanelaChat(Conexao conexao) { 
    super("chat"); 
    this.conexao = conexao; 
    initComponents(); 
    conexao.addObserver(this); 
    escreve("Chat iniciado com " + conexao.getIp() + ":" + conexao.getPorta()); 
    mensagemjTextArea.requestFocusInWindow(); 
} 

private void envia() { 
    if (!mensagemjTextArea.getText().isEmpty()) { 
     conexao.envia(mensagemjTextArea.getText()); 
     escreve("Você disse: " + mensagemjTextArea.getText()); 
     mensagemjTextArea.setText(""); 
    } 
} 

private void escreve(String texto) { 
    chatjTextArea.append(texto + "\n"); 
    if (!chatjTextArea.getText().isEmpty() && !chatjTextArea.isFocusOwner()) { 
     chatjTextArea.setCaretPosition(chatjTextArea.getText().length() - 1); 
    } 

} 

Vielen Dank für Ihre Aufmerksamkeit und Entschuldigung für mein Englisch Ich hoffe, ich war klar.

Antwort

0

Sie machen unhaltbare Annahmen über Ihren Transport. UDP-Datagramme können mehrmals, nicht oder nicht mehr gesendet werden. Wenn Sie Zuverlässigkeit, Sequenzierung, Nichtwiederholung usw. wünschen, verwenden Sie TCP.

Sie haben andere Probleme. Der richtige Weg, um einen String von einer neu empfangenen Datagramms zu konstruieren (vorausgesetzt, es Zeichendaten nur enthält) ist:

String s = new String(packet.getData(), packet.getOffset(), packet.getLength()); 

Sie brauchen nicht all Null-Kontrolle: nur das oben.

+0

Vielen Dank half ziemlich gearbeitet –