Verliere Daten mit WinXP

Status
Nicht offen für weitere Antworten.

muge

Mitglied
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:
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;
            }
Der Thread liest dann vom Socket
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.
 

muge

Mitglied
Das ist aber die Aufgabe von TCP (dieses Transportprotokoll wird ja verwendet).
Ich habe gemeint die implementierung von TCP von Windows funktioniere seit Win 95.
 

KISS

Bekanntes Mitglied
*g* nein, tcp stellt sicher das die packete ankommen. das du sie ordentlich verarbeitest musst du selber sicherstellen.
was den tcp stack von windows angeht, da sind immer mal wieder fehler drin, google mal nach synflood.
zurueck zum thema: ich denke das problem ist die accept method, uu kommen 2 connect anfragen warend du nur 1 hanldest . du kannst ja mal versuchen das server backlog hochzustellen
 

muge

Mitglied
Ja, das ist klar. TCP stellt die Verbindung bis an den Port sicher. Danach bin ich verantwortlich.

Das mit dem Accept leuchtet mir nicht ein: ich habe gar keine andere Wahl als pro accept nur eine Verbindung entgegenzunehmen. deshalb wird diese Verbindung dann sofort in einen neuen Thread übergeben.
Ausserdem werden mehrere echt gleichzeitige Verbindungsanfragen von der VM (und ich glaube sogar auch vom Betriebssystem) gecached.

Ich habe derzeit eher die Befürchtung, dass dem Client der Socket wegstribt und ich diesen fehler mit isClosed() nicht mitkriege. Was meinst du dazu?

thx
muge
 

KISS

Bekanntes Mitglied
muge hat gesagt.:
Das mit dem Accept leuchtet mir nicht ein: ich habe gar keine andere Wahl als pro accept nur eine Verbindung entgegenzunehmen. deshalb wird diese Verbindung dann sofort in einen neuen Thread übergeben.

richtig, aber das passiert ja nun auch nicht in 0-zeit.
sollten sich waerend dieser zeit mehr als 50 weitere clients anmelden, werden diese connections (>50) refused.
darum solltest du ja das backlog modifizieren
 

muge

Mitglied
ich habe jetzt ein wenig mit dem backlog (setReceiveBufferSize()) gespielt, beim Client und beim Server. Beim besten Wert (receive buffer beim server = 1) verliere ich immer noch 30 - 40 von 10000 Nachrichten :-/.

[edit] Sorry, falsche zahlen. 300 - 400 von 10000 Nachrichten gehen verloren[/edit]
 

KISS

Bekanntes Mitglied
ich glaube da hast du was falsch verstanden, setz den wert doch mal auf 10000 und schaue wieviele nachrichten dann entfleuchen
 

muge

Mitglied
habe ich gemacht, aber seltsamerweise hat er dann über 500 Nachrichten verloren, bei noch höheren werten (100000) bis zu 3000 Nachrichten... das ich es auch mit kleinen Werten versucht habe war mer der vollständigkeit wegen...
 

muge

Mitglied
Ich habe jetzt noch einen Thread.sleep(1) eingebaut, der beim senden jeder zweiten Nachricht angewendet wird. Jetzt bringe ich alle 10000 Nachrichten durch... allerdings gefällt mir diese Lösung überhaupt nicht. Ein gebastel und erst noch klar langsamer...
 

muge

Mitglied
Ich habe nun die Ursache gefunden und damit gleich eine neue frage :-/.

Das Problem ist eigentlich: Der Server kriegt beim lesen vom Socket eine Exception: connection reset
(dass ich das nicht früher bemerkt habe ist das resultat 2er Programmierfehler beim Exceptiohandling meinerseits :-( )

Jetzt habe ich grosse schwierigkeiten, beim Client festzustellen, dass der Socket gereseted wurde. Eigentlich habe ich keine Ahnung, wie ich das feststellen soll...

Kann mir jemand helfen?

thx
muge
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
Z Kann nicht Daten vom Server lesen Socket Netzwerkprogrammierung 10
S Daten über TCP/IP senden Netzwerkprogrammierung 3
B Daten an Javaprogramm per URI Aufruf übergeben Netzwerkprogrammierung 7
N websocket - keine Daten mehr nach ca 80 Sekunden Netzwerkprogrammierung 0
C Spezielle Daten aus Website entnehmen Netzwerkprogrammierung 5
H Daten auf einer Webseite eintragen Netzwerkprogrammierung 11
A Socket Daten in Textdokument speichern? Netzwerkprogrammierung 1
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
J Daten von einem HTML-Textfeld abrufen Netzwerkprogrammierung 3
S Fakturierungsprogramm - Daten aktuell halten (blutiger Anfänger) Netzwerkprogrammierung 1
D Mit Server Daten austauschen Netzwerkprogrammierung 4
K Server liest Daten nicht Netzwerkprogrammierung 6
L HTTP Daten an Server übergeben Netzwerkprogrammierung 2
R Daten von Cloud laden Netzwerkprogrammierung 5
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
X Daten können nicht sofort empfangen werden Netzwerkprogrammierung 1
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
P Socket Best Practice: Daten bündeln Netzwerkprogrammierung 5
E Verfügbarkeit von Daten in Streams Netzwerkprogrammierung 4
F Daten aus Internetseiten auslesen Netzwerkprogrammierung 56
S Server Client Daten hin und herschicken Netzwerkprogrammierung 2
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
H Daten an Textfeld einer Webseite schicken Netzwerkprogrammierung 2
A versch. Daten im Stream erkennen Netzwerkprogrammierung 2
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
J Applet soll Daten auf Server ablegen - einfachster Weg fuer n00bs? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
F UDP Daten kommen nicht an Netzwerkprogrammierung 22
E Socket OutputSream abbruch.Wegen zuviel !empfangener! Daten? Netzwerkprogrammierung 10
C Client zu Client Daten übertragen Netzwerkprogrammierung 13
S Thread, Daten vom Socket lesen Netzwerkprogrammierung 2
S Socket XML-Daten und Parameter an Server schicken Netzwerkprogrammierung 3
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P HttpClient - Daten einer Website "unvollständig" Netzwerkprogrammierung 5
P Server/Client Daten empfangen, wenn Daten gesendet werden Netzwerkprogrammierung 9
K Socket Daten lesen ohne Längenangabe Netzwerkprogrammierung 19
T RMI Effizenteste Übertragung von Daten Netzwerkprogrammierung 6
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
B Socket Daten empfangen funktioniert nicht richtig - wo liegt der Fehler? Netzwerkprogrammierung 7
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
E Daten kommen anders an als gesendert ?! Netzwerkprogrammierung 6
S HttpURLConnection POST splittet Daten in zwei Pakete Netzwerkprogrammierung 9
F POST-Daten sende Netzwerkprogrammierung 3
E HTTPS Debuggen (verschlüsselte Daten anzeigen)? Netzwerkprogrammierung 12
N Per POST -Methode Daten an den Web-Server übertragen. Netzwerkprogrammierung 9
Iron Monkey Große Daten ins Vector füllen Netzwerkprogrammierung 4
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
D Daten, die mit PHP erzeugt werden, mit Java auslesen Netzwerkprogrammierung 8
M Ethernet Daten abfangen Netzwerkprogrammierung 13
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
S Daten per GET-Methode Netzwerkprogrammierung 2
H Server soll Daten schicken, aber wie? Netzwerkprogrammierung 47
M Socket schließt bevor Daten komplett geladen Netzwerkprogrammierung 5
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
M Daten übers Netz verschlüsselt übertragen? Wie? Netzwerkprogrammierung 18
J Post-Daten an URL schicken Netzwerkprogrammierung 2
U Image erzeugen aus empfangenen Daten Netzwerkprogrammierung 7
A Wie werden Daten versendet? "Crashcode" Netzwerkprogrammierung 4
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
G unvollständige Daten: Http Client-Server-Kommunikation Netzwerkprogrammierung 2
E Multi-Part Form-Daten mit HttpURLConnection Netzwerkprogrammierung 6
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
T Daten über GSM verschicken Netzwerkprogrammierung 4
M Einfachste Möglichkeit aus'm Applet Daten an Server senden Netzwerkprogrammierung 6
P Verschiedene Daten über einen Stream Netzwerkprogrammierung 4
O eingehende Daten speichern Netzwerkprogrammierung 3
D UDP-Daten anzeigen Netzwerkprogrammierung 2
D Daten per Server- Client nur als byte verschicken? Netzwerkprogrammierung 3
A daten an php script per post senden und ausgabe einlesen Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben