Hallo zusammen,
Ich habe folgendes Problem mit den Java ObjectOutput- und ObjectInputstreams:
Ich baue gerade ein Client-Server Programm, was sich von der Architektur her an diesem Tutorial orientiert: http://java.seite.net/chat/sockets.html Der Server "horcht" also die ganze Zeit auf eingehende Clientverbindungen, die er dann als Thread vom Typ "Connection" in einer Liste abspeichert. Der Server kommuniziert dann mit den Clients über diese ConnectionsThreads, die jeder einen eigenen Out- und InputStream haben.
Mein Server hat nun eine Funktion, die eine Liste vom Typ Vector<Client>, zu allen Clients schicken soll. Und zwar immer wenn sich ein neuer Client verbindet. Wenn ein Client zum ersten Mal diese Liste empfängt, ist alles okay, aber wenn ein Client diese Liste zum wiederholten Mal empfängt, dann ist dieses Listenobjekt eine alte Version. Dass heißt, dieses alte Listenobjekt enthält dann nicht die aktuellen Clients, sondern nur diejenigen, die beim ersten Empfang der Liste schon enthalten waren.
Ich habe das mehrfach über Sysem.out.println und über den Debugger überprüft und es ist wirklich so, dass das Listenobjekt direkt vor dem Senden vom Server noch eine andere Größe hat als direkt nach dem Empfangen beim Client. Hier sind wichtigsten Stellen vom SourceCode, wenn die nicht ausreichen, kann ich nochmal die ganzen Klassen posten.
Der Code zum akzeptieren neuer ClientVerbindungen auf der Serverseite:
Der Code vom Senden auf der Serverseite:
Der Code fürs Empfangen auf der Clientseite:
Ist dieses Problem schonmal Jemandem untergekommen oder kann mir Jemand einen Tip geben, woran das liegen könnte? Das wär super!
Ich habe folgendes Problem mit den Java ObjectOutput- und ObjectInputstreams:
Ich baue gerade ein Client-Server Programm, was sich von der Architektur her an diesem Tutorial orientiert: http://java.seite.net/chat/sockets.html Der Server "horcht" also die ganze Zeit auf eingehende Clientverbindungen, die er dann als Thread vom Typ "Connection" in einer Liste abspeichert. Der Server kommuniziert dann mit den Clients über diese ConnectionsThreads, die jeder einen eigenen Out- und InputStream haben.
Mein Server hat nun eine Funktion, die eine Liste vom Typ Vector<Client>, zu allen Clients schicken soll. Und zwar immer wenn sich ein neuer Client verbindet. Wenn ein Client zum ersten Mal diese Liste empfängt, ist alles okay, aber wenn ein Client diese Liste zum wiederholten Mal empfängt, dann ist dieses Listenobjekt eine alte Version. Dass heißt, dieses alte Listenobjekt enthält dann nicht die aktuellen Clients, sondern nur diejenigen, die beim ersten Empfang der Liste schon enthalten waren.
Ich habe das mehrfach über Sysem.out.println und über den Debugger überprüft und es ist wirklich so, dass das Listenobjekt direkt vor dem Senden vom Server noch eine andere Größe hat als direkt nach dem Empfangen beim Client. Hier sind wichtigsten Stellen vom SourceCode, wenn die nicht ausreichen, kann ich nochmal die ganzen Klassen posten.
Der Code zum akzeptieren neuer ClientVerbindungen auf der Serverseite:
Code:
public void run()
{
try {
while (true){
Socket client = server.accept();
clientListe.add(new Connection(client));
Logger.getLogger(this.getClass()).info(
"Der Rechner "+client.getInetAddress().getHostAddress()+
" verbindet sich zum Server");
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
Der Code vom Senden auf der Serverseite:
Code:
public void clientsInformieren(Vector<Client> clientListe){
//Die Clients informieren
for (Iterator<Connection> iterator = connections.iterator(); iterator.hasNext();) {
Connection connection = iterator.next();
try {
System.out.println("Groesse der Liste: "+clientListe.size());
connection.objectOut.writeObject(clientListe);
connection.objectOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Der Code fürs Empfangen auf der Clientseite:
Code:
public void run(){
while(true){
try {
Object eingehendeDaten = objectIn.readObject();
System.out.println(eingehendeDaten.getClass().getName());
if( eingehendeDaten instanceof Integer){
int code = (Integer) eingehendeDaten;
if( code== DataID.codeBenutzerdatenOkay ||
code== DataID.codeBenutzerdatenFalsch){
benutzerDatenCheckListener.benutzerDatenValiditaetMelden(code);
} else{
System.err.println("Anderer Code!");
}
} else if( eingehendeDaten instanceof Vector) {
Vector<Client> liste = (Vector<Client>) eingehendeDaten;
//Hier wird die Groesse der Liste ausgegeben:
System.out.println("Liste setzen. Groesse: "+liste.size());
clientListeListener.setListModel(new ClientListModel(liste));
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Ist dieses Problem schonmal Jemandem untergekommen oder kann mir Jemand einen Tip geben, woran das liegen könnte? Das wär super!