ERLEDIGT
NEIN
NEIN
ANTWORTEN
6
6
ZUGRIFFE
456
456
EMPFEHLEN
-
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 :1 2 3 4 5 6
clientSocket.connect(sockaddr); OutputStream out = clientSocket.getOutputStream(); out.write("TESTNACHRICHT".getBytes()); out.write("testnachricht".getBytes());
Code :1 2 3 4 5
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:
oder:FROM SERVER: TESTNACHRICHTtestnachricht
was nun ganz und garnicht dem gewünschten Ergebnis entspricht.FROM SERVER: TESTNACHRICHTTESTNACHRICHT
FROM SERVER: testnachricht
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
-
08.06.10 17:09 #2
Wieso ist das Ergebniss nicht so wie erwartet? Funktioniert doch alles so wie programmiert.
Code :1 2 3 4 5 6 7
out.write("TESTNACHRICHT".getBytes()); out.write("\n".getBytes()); out.write("testnachricht".getBytes()); // Ergebniss FROM SERVER: TESTNACHRICHT testnachrichtDenken gefärdet die Gewohnheit
-
-
09.06.10 12:49 #4
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.Denken gefärdet die Gewohnheit
-
-
09.06.10 13:22 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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ßIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
11.06.10 16:59 #7
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.Denken gefärdet die Gewohnheit
Ähnliche Themen
-
Maus spielt verrückt
Von IrealiTY im Forum Cinema 4DAntworten: 2Letzter Beitrag: 18.11.08, 12:36 -
Sitemap spielt verrückt...
Von flying-anzi im Forum XML TechnologienAntworten: 2Letzter Beitrag: 19.07.07, 17:27 -
VB spielt verrückt
Von Mailyn im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 24.12.05, 13:23 -
Eclipse spielt verrückt
Von zeromancer im Forum JavaAntworten: 4Letzter Beitrag: 30.05.04, 21:11 -
Schattenmap spielt verrückt ....
Von gilgamesch im Forum 3D Studio MaxAntworten: 4Letzter Beitrag: 13.01.04, 14:49





Zitieren
Login





