OutputStream/InputStream spielt verrückt

BigPepe

Grünschnabel
Hallo

und zwar schicke ich zwischen 2 Rechnern Daten hin und her. Nun hab ich jedoch das Problem das ab und an mehrere Datensätze ankommen.


der folgende Code ist nicht der Originalcode sondern die vereinfachte Variante

Code:
        clientSocket.connect(sockaddr);
        OutputStream out = clientSocket.getOutputStream();

        out.write("TESTNACHRICHT".getBytes());

        out.write("testnachricht".getBytes());

Code:
InputStream in = clientSocket.getInputStream();
i = in.read(receive);
byte[] data = new byte[i];
System.arraycopy(receive, 0, data, 0, data.length);
System.out.println("FROM SERVER: " + new String(data));

Auf dem Empfänger bekomme ich dann sowas wie:
FROM SERVER: TESTNACHRICHTtestnachricht
oder:
FROM SERVER: TESTNACHRICHTTESTNACHRICHT
FROM SERVER: testnachricht
was nun ganz und garnicht dem gewünschten Ergebnis entspricht.
Ich habe es schon mit '\n' und flush probiert. Jedoch ohne Erfolg.

Ich denke das es irgendein Formfehler ist da es mit dem gleichen Code auf meinem LinuxServer funktioniert.

Ich hoffe mir kann hier jemand weiterhelfen.

BigPepe
 
Wieso ist das Ergebniss nicht so wie erwartet? Funktioniert doch alles so wie programmiert.
Code:
        out.write("TESTNACHRICHT".getBytes());
        out.write("\n".getBytes());
        out.write("testnachricht".getBytes());

// Ergebniss
FROM SERVER: TESTNACHRICHT
testnachricht
 
Das Problem ist das dort eigentlich das stehen müsste
Code:
FROM SERVER: TESTNACHRICHT
FROM SERVER: testnachricht
Da ich ja 2 getrennte sätze verschickt will ich auch das sie getrennt ankommen und nicht plötzlich in einem da sind.


Wieso ist das Ergebniss nicht so wie erwartet? Funktioniert doch alles so wie programmiert.
Code:
        out.write("TESTNACHRICHT".getBytes());
        out.write("\n".getBytes());
        out.write("testnachricht".getBytes());

// Ergebniss
FROM SERVER: TESTNACHRICHT
testnachricht
 
Ok, verstehe.
Das liegt an dem Verhalten der Stream Implementationen. Die Methode write() schreibt ein Objekt in einen Stream. Es wird keine Steuerzeichen oder ähnliches verwendet, wie es System.out.println() z.B. macht. println() weisst im Namen darauf hin, dass eine Zeile geschrieben wird.

write() führt auch nicht zu einer direkten Abarbeitung. Dies ist eine Optimierung der gewählten Implementation, der Inhalt wird gepuffert, man kann den Stream so schön vorbereiten mit beliebig vielen Aufrufen. Die Abarbeitung kann dann mit flush() explizit angestossen werden.
 
Das Problem tritt selbst dann auf wenn ich mit flush() die Übermittlung anstoße.

Ok, verstehe.
Das liegt an dem Verhalten der Stream Implementationen. Die Methode write() schreibt ein Objekt in einen Stream. Es wird keine Steuerzeichen oder ähnliches verwendet, wie es System.out.println() z.B. macht. println() weisst im Namen darauf hin, dass eine Zeile geschrieben wird.

write() führt auch nicht zu einer direkten Abarbeitung. Dies ist eine Optimierung der gewählten Implementation, der Inhalt wird gepuffert, man kann den Stream so schön vorbereiten mit beliebig vielen Aufrufen. Die Abarbeitung kann dann mit flush() explizit angestossen werden.
 
Hi.

Ein Stream ist nunmal ein kontinuierlicher Strom von Daten und wenn du zweimal hintereinander Daten reinschreibst, stehen die Daten auch hintereinander drin. Die beiden Streams arbeiten doch völlig unabhängig voneinander, da ist es völlig irrelevant ob du flush aufrufst oder nicht, der Stream auf der anderen Seite hat evtl. eine ganz andere Puffergröße und liest soviel Daten wie gerade vorliegen oder in den internen Puffer passen.

Wenn du Nachrichten über Sockets schicken willst, mußt du dir ein Protokoll ausdenken, so dass du unterscheiden kannst wo eine Nachricht anfängt und aufhört bzw. wo die nächste Nachricht beginnt.

Gruß
 
Das Problem tritt selbst dann auf wenn ich mit flush() die Übermittlung anstoße.
Flush ändert auch nichts am Inhalt des Streams.
Nachdem der Stream auf der Senderseite geflusht wurde, kann auf der Empfängerseite der Stream ausgelesen werden.
Solange der Sender seinen Stream nicht flusht oder closed liegt es in den Implementierungsdetails, wann tatsächlich die Daten aus einem internen Puffer an das Ziel des Streams gehen. Dies ist von Interesse, da Sender und Empfänger meist in verschiedene Threads realisiert sind.
 

Neue Beiträge

Zurück