Socket OutputStreams senden zu oft

S

SebastianF

Gast
Hallo.

Ich schreibe derzeit einen Server über den unter anderem auch gechattet werden können soll. Für jeden Client wird ein neuer Thread gestartet. Jeder Thread besitzt ein eigenes Socket zu seinem Client.
Empfangen und senden funktioniert eigentlich prächtig, wenn da nicht folgendes Problem wäre:
Egal welchen Writer ich benutze, egal ob gepuffert oder nicht, egal ob PrintWriter mit println(), print() oder BufferedWriter mit write(), ich bekomme ein reproduzierbares Problem, dass mein Server meint, etwas nur einmal gesendet zu haben, der Server empfängt es aber mehrfach und zerstückelt.
Ich weiß nicht, wie das kommen kann, denn wie gesagt: jeder Client bekommt ein eigenes Socket in seinem Thread. Kein anderer Client kann da dazwischenfunken. Es gibt auch nur sequentielle Zugriffe auf das Socket.
Zum Senden verwende ich derzeit folgende Methode:
Java:
    private void out(String s)
    {
        s = s + end;
        try
        {
            BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
            wr.write(s);
            wr.flush();
        } catch(IOException ioe)
        {
            logError("IOException on socket listen: " + ioe);
        }
        System.out.println("=> " + server.getInetAddress().getHostAddress() + " : " + s);
    }

Ich habe zusätzlich das Problem, dass die Clients kein \r\n oder ähnliches zum terminieren verwenden, sondern die Zeichenfolge "|END|" (deshalb die Stringaddition). println() funktioniert deswegen sowieso nicht und ich kann nicht write(x + "\n") ausführen.

Mein Server meint gesendet zu haben:
<= 127.0.0.1 : SHELL|END|
=> 127.0.0.1 : SHELL|END|
<= 127.0.0.1 : SVERS 1.0.1.0|END|
=> 127.0.0.1 : SVERS 1.2.1.0|END|
<= 127.0.0.1 : SCODE test2@mail.com 1a1dc91c907325c69271ddf0c944bc72|END|
=> 127.0.0.1 : SCODE OK|END|
<= 127.0.0.1 : SNICK ONL|END|
=> 127.0.0.1 : SNICK 72 Dummy 0|END|
=> 127.0.0.1 : SLIST 71 ONL Dummy|END|

Der Client empfängt:
C->S: SHELL|END|
C<-S: SHELL|END|
verarbeite: SHELL
C->S: SVERS 1.0.1.0|END|
C<-S: SVERS 1.2.1.0|END|
verarbeite: SVERS 1.2.1.0
Aktuell verfügbare Version ist: 1.2.1.0
C->S: SCODE test2@mail.com 1a1dc91c907325c69271ddf0c944bc72|END|
C<-S: SCODE OK|END|
verarbeite: SCODE OK
C->S: SNICK ONL|END|
C<-S: SLIST 71 ONL Dummy|EN
C<-S: SLIST 71 ONL Dummy|END|
verarbeite: SLIST 71 ONL Dummy|ENSLIST 71 ONL Dummy

Wieso? Es wird nur ein paar mal hintereinander das out-Kommando aufgerufen. Wobei ab SNICK eine Funktion die Ausgabe von SLIST übernimmt. Lagert Java diese etwa in einen neuen Thread aus?

Vielen Dank schonmal für eure Hilfe.
 

HoaX

Top Contributor
Der Code scheint ok so zu sein, wobei ich mir nicht immer einen neuen BufferedWriter erstellen würde sondern nur einmal am Anfang.

Ich vermute ehr der Fehler liegt am Client. Zeig doch da mal den Code wie du empfängst und was du ausgibst.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Der Code scheint ok so zu sein, wobei ich mir nicht immer einen neuen BufferedWriter erstellen würde sondern nur einmal am Anfang.
jap ... der dürfte spätestens beim Schließen des Socket-Streams von der Bildfläche verschwinden ... bis dahin sollten die ganzen Instanzen Resourcen verschwenden ... ob der auch schon geschlossen wird wenn der BufferWriter geschlossen (wie beim .NET_Framework) weis ich nicht

hand, mogel
 
S

SebastianF

Gast
Hallo.

Der Client ist in C# geschrieben, direkt nach den Informationen der MSDN über TCP-Klassen.

Wir werden jetzt, um den Fehler einzugrenzen, ein paar VMs aufsetzen, den Traffic abhören und dabei versuchen den Fehler zu reproduzieren. Dann sehen wir erstmal, ob ich falsch sende oder der Client falsch empfängt.

Ich sollte noch dazu sagen: es handelt sich nachgewiesen um ein Timingproblem. Übers Internet konnte der Fehler bisher nicht reproduziert werden, vermutlich wegen der langen Laufzeit der Pakete. Ein kurzer Sleep nach jedem out() behebt ebenfalls das Problem. Ich stelle aber nicht gern Eimer unter tropfende Dächer, sondern behebe lieber den Fehler.
 

rlz

Mitglied
Der Server sendet
=> 127.0.0.1 : SNICK 72 Dummy 0|END|
=> 127.0.0.1 : SLIST 71 ONL Dummy|END|

und der Client "empfängt"
C<-S: SLIST 71 ONL Dummy|EN <<<=== ???:L
C<-S: SLIST 71 ONL Dummy|END|

Ich kann mir vorstellen, dass der Client die 2. letzte Zeile kriegt, dann die Ausgabe auf die Konsole einleitet (notify? anderer Thread?), und wenn die Ausgabe der 2.letzten Zeile erfolgen sollte, dann ist im Buffer bereits ein grosser Teil der letzten Zeile

Gruss, Rene
 
S

SebastianF

Gast
Hiho.

Der Fehler lag tatsächlich nicht im Java-Server.
Obwohl der Code, den der C#-Client zum Empfangen von Daten verwendet (mit sehr vielen AsyncCallbacks) "in-the-wild" tausendfach eingesetzt wird, zeigt er die eben hier auftretende Schwäche. Keine Ahnung, warum das noch niemand bemerkt hat.
Der Code wurde ersetzt durch eine blockende, synchrone Variante ersetzt - das fällt beim Client bei den paar ms für den Empfang nicht auf. Nun wird alles korrekt empfangen.
 
G

Gast2

Gast
Obwohl der Code, den der C#-Client zum Empfangen von Daten verwendet (mit sehr vielen AsyncCallbacks) "in-the-wild" tausendfach eingesetzt wird, zeigt er die eben hier auftretende Schwäche.
ich konnte die AsyncCallbacks noch nie leiden - auch nie verwendet

Der Code wurde ersetzt durch eine blockende, synchrone Variante ersetzt - das fällt beim Client bei den paar ms für den Empfang nicht auf. Nun wird alles korrekt empfangen.
dann schiebt das in einen Thread und macht ein Event wenn der Datensatz vollständig angekommen ist

hand, mogel
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Messoras Socket Chatserver mit mehreren OutputStreams Netzwerkprogrammierung 2
D RMI Character Encoding bei In- / OutputStreams Netzwerkprogrammierung 2
G Blockieren beim Öffnen der In und Outputstreams Netzwerkprogrammierung 2
OnDemand Daten per API senden, parallel Netzwerkprogrammierung 9
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
E Socket Befehl senden und antowrt bekommen ! Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
L Strings an Server senden und in MYSQL speichern? Netzwerkprogrammierung 3
L Socket Nachrichten senden Netzwerkprogrammierung 3
D Socket Message an einen Server senden? Netzwerkprogrammierung 8
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
B Java+Grbl: G-Code Befehle mit Java an Arduino senden und lesen Netzwerkprogrammierung 1
M Socket Bilder senden Netzwerkprogrammierung 1
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
W Socket Byte Array senden Netzwerkprogrammierung 2
G Mail senden funktioniert nicht mit SSL Netzwerkprogrammierung 7
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
X UDP - Zu großes Paket senden Netzwerkprogrammierung 1
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
I Kleine Dateien senden Netzwerkprogrammierung 3
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
S Server-Client: Image senden Netzwerkprogrammierung 2
B Socket BufferedImage senden "ohne speichern" Netzwerkprogrammierung 7
P Socket Daten senden mit ServerSocket? Netzwerkprogrammierung 2
Z Socket Probleme beim Senden und Empfangen Netzwerkprogrammierung 5
Z Probleme beim Senden von Nachrichten an den Server Netzwerkprogrammierung 9
K Socket Senden und abspeichern Netzwerkprogrammierung 34
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
M Gleicher Port für Senden und Empfangen ? Netzwerkprogrammierung 17
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Empfangen klappt Senden nicht - Connection timed out Netzwerkprogrammierung 12
D Strings per Schleife zum Client senden Netzwerkprogrammierung 4
D daten per post senden Netzwerkprogrammierung 3
M Senden von Daten nicht direkt möglich? Netzwerkprogrammierung 6
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
F Verschiedene Datentypen senden Netzwerkprogrammierung 4
M Befehle an externes Java-Programm senden Netzwerkprogrammierung 8
1 Datei senden/empfangen funzt nicht... Netzwerkprogrammierung 5
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
Weltall 7 HTTP Dateien an PHP-Skript senden Netzwerkprogrammierung 11
T Outputstream Byte-Array senden Netzwerkprogrammierung 2
N Senden eines Arrays Netzwerkprogrammierung 6
F Char über Netzwerk senden Netzwerkprogrammierung 6
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
J Befehle an Server senden Netzwerkprogrammierung 5
L Zeitspanne für erneutes senden Netzwerkprogrammierung 16
Kr0e Ggf. Performanceproblem durch Senden von vielen kleinen Buffern Netzwerkprogrammierung 17
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
KeNnY_tHe_OwNeR Empfangen geht, Senden nicht ?! Netzwerkprogrammierung 18
B Befehle an Gameserver senden bzw. empfangen Netzwerkprogrammierung 2
P Probleme beim weiter senden von Datein Netzwerkprogrammierung 10
T HttpClient - Senden via Post Netzwerkprogrammierung 12
Q Datein von Windows nach Mac senden Netzwerkprogrammierung 4
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
M Dateien über TCP/IP senden Netzwerkprogrammierung 18
Q NullPointExeption beim Versuch byte[] zu senden/writen Netzwerkprogrammierung 3
S Probleme beim senden von Daten per POST Methode an PHP Scrip Netzwerkprogrammierung 5
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
F Daten senden und empfangen mit Applet Netzwerkprogrammierung 8
G Information an Server senden? Netzwerkprogrammierung 4
D PDF und integer senden Netzwerkprogrammierung 6
M BufferedImage an PHP-Script senden Netzwerkprogrammierung 4
J Problem beim Senden von File Netzwerkprogrammierung 4
S String[] über Socket senden Netzwerkprogrammierung 3
G unbekannte Zeichen beim senden und lesen Netzwerkprogrammierung 2
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
T Image aus Applet an PHP Seite senden? Netzwerkprogrammierung 3
D BufferedImage über das Netzwerk senden Netzwerkprogrammierung 2
C Flash Daten an Java senden, wie serialisieren? Netzwerkprogrammierung 3
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
R Bytes als Rohdaten über Socket senden Netzwerkprogrammierung 3
E rxtx serielles senden von Daten Netzwerkprogrammierung 2
D Socket, Daten über BufferedWriter senden Netzwerkprogrammierung 18
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
W Hexadezimal über RS232 senden Netzwerkprogrammierung 9
L webformular automatisch erstellen, senden und auswerten . Netzwerkprogrammierung 2
G Anfrage an Suchmaschine senden Netzwerkprogrammierung 11
M TCP Socket und Server int senden und empfangen Netzwerkprogrammierung 6
M datagramSocket senden u. empangen? Netzwerkprogrammierung 2
V Java /Matrizen senden über TCP/IP / double Netzwerkprogrammierung 2
W Socket Client-Server Verbindung. Wie Strings senden? Netzwerkprogrammierung 6
M HTTP Requests verarbeiten und Response senden mit Java Netzwerkprogrammierung 14
G Problem bei Objekt senden von server zu client Netzwerkprogrammierung 6
K RMI und kontinuirliches senden von Datenpacketen Netzwerkprogrammierung 2
N Messwerte über TCP senden Netzwerkprogrammierung 3
F Datei senden und empfangen Netzwerkprogrammierung 4
M Ein HTTP-request aus Java heraus senden Netzwerkprogrammierung 3
N Hexcode an ein Programm senden. Netzwerkprogrammierung 4
I Dateien schnell/synchron senden Netzwerkprogrammierung 2
T Datei senden Netzwerkprogrammierung 3
B Variablen an Server senden Netzwerkprogrammierung 14
R Problem beim Senden von Emails (Javamail) Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben