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.
Vielen Dank half ziemlich gearbeitet –