Hallo zusammen.
Ich habe folgendes Problem:
Ein Client schickt einem Server Nachrichten, die dieser in ein File schreibt. Pro client erzeugt der Server einen neuen Thread und behält die Socketverbindung offen. Falls die Socketverbindung abbricht ( == null oder !isConnected()) wird ein neuer socket erzeugt (demzufolge auch ein neuer Thread auf dem Server). Alle Threads schreiben in das gleiche file (die schreibmethode ist synchronized). Diese Anwendung funktioniert grundsätzlich auch.
Nun habe ich festgestellt, dass hin und wieder Nachrichten verloren gehen und zwar bei folgendem fall:
Client (WinXP) sendet Server(WinXP) (egal ob localhost oder zwei rechner) mehrere einträge hintereinander (nur ein client aktiv). Es gehen jeweils die letzten paar messages verloren ( bei 2000 Nachrichten etwa 150 +-100%, bei 20000 etwa zwischen 2000 und 3 ). soweit so schlecht.
Wenn ich bei der sendroutine einen delay einbaue, so bekomme ich von 2000 Nachrichten etwa 1997, aber praktisch nie alle (ist aber auch schon vorgekommen). soweit noch nicht besser.
Dieser Absatz bezieht sich auf Java 1.5 mit Windows XP Pro. Das ist sehr wichtig!
Sobald ein Teil (egal ob client oder Server oder beide) unter Linux läuft (Java 1.5, Kernel 2.6.8) so habe ich diese Probleme nicht mehr. Ohne delay 40'000 Nachrichten senden ist kein Problem, es kommen alle durch.
Tja, jetzt ist meine frage: wie behebe ich den Nachrichtenverlust unter Windows? Es wird ja wohl möglich sein mit java und windows verlustfrei daten zu übertragen...
Sobald der Client die Nachricht gesendet hat, flusht er den ObjectOutputStream.
Der Client:
Der Server:
Der Thread liest dann vom Socket
Weder auf der Client noch auf der Serverseite treten irgendwelche Exceptions auf.
Hat da jemand eine Idee? Ich bin so ziemlich am Ende mit meinem Latein.
thx
muge
Ps: Die Applikation muss unter Windows laufen können, da komme ich nicht drum herum.
Ich habe folgendes Problem:
Ein Client schickt einem Server Nachrichten, die dieser in ein File schreibt. Pro client erzeugt der Server einen neuen Thread und behält die Socketverbindung offen. Falls die Socketverbindung abbricht ( == null oder !isConnected()) wird ein neuer socket erzeugt (demzufolge auch ein neuer Thread auf dem Server). Alle Threads schreiben in das gleiche file (die schreibmethode ist synchronized). Diese Anwendung funktioniert grundsätzlich auch.
Nun habe ich festgestellt, dass hin und wieder Nachrichten verloren gehen und zwar bei folgendem fall:
Client (WinXP) sendet Server(WinXP) (egal ob localhost oder zwei rechner) mehrere einträge hintereinander (nur ein client aktiv). Es gehen jeweils die letzten paar messages verloren ( bei 2000 Nachrichten etwa 150 +-100%, bei 20000 etwa zwischen 2000 und 3 ). soweit so schlecht.
Wenn ich bei der sendroutine einen delay einbaue, so bekomme ich von 2000 Nachrichten etwa 1997, aber praktisch nie alle (ist aber auch schon vorgekommen). soweit noch nicht besser.
Dieser Absatz bezieht sich auf Java 1.5 mit Windows XP Pro. Das ist sehr wichtig!
Sobald ein Teil (egal ob client oder Server oder beide) unter Linux läuft (Java 1.5, Kernel 2.6.8) so habe ich diese Probleme nicht mehr. Ohne delay 40'000 Nachrichten senden ist kein Problem, es kommen alle durch.
Tja, jetzt ist meine frage: wie behebe ich den Nachrichtenverlust unter Windows? Es wird ja wohl möglich sein mit java und windows verlustfrei daten zu übertragen...
Sobald der Client die Nachricht gesendet hat, flusht er den ObjectOutputStream.
Der Client:
Code:
if (socket == null || !socket.isConnected()) {
try {
socket = new Socket(ip, port);
out = new ObjectOutputStream(socket.getOutputStream());
}
catch (IOException ioe) {
System.err.println("Couldn't get socket. " + ioe.toString());
return;
}
}
try {
out.writeUTF(msg.toString());
out.flush();
}
catch (Exception e) {
System.err.println("Couldn't write to socket. " + e.toString());
}
Der Server:
Code:
socket = server.accept();
System.out.println("accept");
try{
LogThread thread = new LogThread(socket, buffer, type, write, dumpDir);
thread.start();
}
catch( IOException e ){
System.out.println("LogThread.start(): Error while reading from the socket! " + e.toString());
com.close();
return;
}
Code:
input = new ObjectInputStream(socket.getInputStream());
try{
data = input.readUTF();
}
catch (Exception e){
write.writeStdErr("Error while reading from socket!" + e.toString());
}
Weder auf der Client noch auf der Serverseite treten irgendwelche Exceptions auf.
Hat da jemand eine Idee? Ich bin so ziemlich am Ende mit meinem Latein.
thx
muge
Ps: Die Applikation muss unter Windows laufen können, da komme ich nicht drum herum.