Frage zu Streams und Sockets
-
Hallo,
ich benutze Sockets in Java über die ich mittels Stream kommuniziere:
ServerSocket server = new ServerSocket(1234); //port: 1234 Socket accept = Server.accept(); PrintStream portWriter = new PrintStream(accept.getOutputStream());
Nun ist es ja so, dass hierbei TCP/IP benutzt wird und die Reihenfolge der Daten garantiert wird, also wenn ich den String "abcde" mittels
portWriter.println("abcde"); portWriter.flush();
verschicke kommt er auch genau so auf der anderen Seite an.
Ist die Reihenfolge auch garantiert wenn ich mehrmals hintereinander Daten schicke?portWriter.println("abcde"); portWriter.flush(); portWriter.println("fghij"); portWriter.flush();
Wenn nein, wie kann ich möglichst einfach garantieren, dass diese Daten in der gleichen Reihenfolge ankommen?
-
Servus,
http://de.wikipedia.org/wiki/TCP/IP-Referenzmodell#TCP.2FIP-Referenzmodell
Beim TCP/IP-Protokoll musst du dir keine Gedanken über die Reihenfolger der eintreffenden Paketten machen. Das gilt für alle Nachrichten innerhalb einer Verbindung. Sendest du mehrmals Nachrichten innerhalb des selben Streams, dann kommen diese auch in der Reihenfolge.
Geht ein Paket verloren oder kommt nicht innerhalb der Zeit t an, wird eine IOException geworfen.Übrigends, ich glaube du hast da etwas falsch verstanden. Wenn du einen String "abcdef" als Paket versendest, dann kommt dieser auch bei UDP als "abcdef" an! Bei UDP ist nicht sichergesellt
- in welcher Reihenfolge die versendeten Paketen ankommen
- ob ein Paket überhaupt ankommt
- wie lange es dauert bis ein Paket ankommt (bei TCP/IP bekommst du ja ein Timeout)
--> Bei UDP musst du dich um alles kümmern, was TCP/IP automatisch macht. UDP eignet sich daher nur für ein paar Einzelfälle. Bzw. der Vorteil von UDP ist nur dann von nutzen, wenn auch mal ein paar Daten verloren gehen dürfen.
z.B. bei einem Ping-Test der alle 100 ms durchgeführt wird. Geht hier das Paket verloren ist das überhaupt nicht schlimm. Es gilt dann halt der Wert des letzten erfolgreich versanten Pakets.siehe http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/networking/datagrams/index.html
-
Ok, vielen Dank für die ausführliche Erklärung. Ich hatte bei meinem Programm nur festgestellt (nicht das oben gepostete), dass die Pakete doch unterschiedlich ankamen, aber der Fehler lag in einer Race-Condition.