2016-04-24 10 views
0

こんにちは私は内部IPネットワークを使用してJavaとチャットをしていますが、いくつかのメッセージを送信した後、このメッセージを新しく送信し、 がコードに従います。Javaソケットの前のメッセージの最近の投稿

Conexao.java

パブリッククラスConexaoは観測{

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

パブリッククラスJanelaChatがjavax.swing.JFrameが{

オブザーバを実装延びて延びています
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); 
    } 

} 

ご注意いただきありがとうございます。私の英語のために申し訳ありません。

答えて

0

あなたの輸送についての容赦のない仮定をしています。 UDPデータグラムは、複数回、順序どおりに、またはまったく配信されません。信頼性、シーケンシング、非繰り返しなどが必要な場合は、TCPを使用してください。

その他の問題があります。新たに受信したデータグラム(それは文字データのみが含まれていると仮定)から文字列を構築するための正しい方法は次のとおりです。

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

あなたはすべてのNULLチェックを必要としない:すぐ上。

+0

ありがとうございました –

関連する問題