tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
456
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    BigPepe BigPepe ist offline Rookie
    Registriert seit
    Jun 2010
    Beiträge
    6
    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:
    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
     

  2. #2
    Avatar von Franz Degenhardt
    Franz Degenhardt Franz Degenhardt ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Ort
    Köln
    Beiträge
    378
    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
    testnachricht
     
    Denken gefärdet die Gewohnheit

  3. #3
    BigPepe BigPepe ist offline Rookie
    Registriert seit
    Jun 2010
    Beiträge
    6
    Das Problem ist das dort eigentlich das stehen müsste
    Code :
    1
    2
    
    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.


    Zitat Zitat von Franz Degenhardt Beitrag anzeigen
    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
    testnachricht
     

  4. #4
    Avatar von Franz Degenhardt
    Franz Degenhardt Franz Degenhardt ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Ort
    Köln
    Beiträge
    378
    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

  5. #5
    BigPepe BigPepe ist offline Rookie
    Registriert seit
    Jun 2010
    Beiträge
    6
    Das Problem tritt selbst dann auf wenn ich mit flush() die Übermittlung anstoße.

    Zitat Zitat von Franz Degenhardt Beitrag anzeigen
    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.
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  7. #7
    Avatar von Franz Degenhardt
    Franz Degenhardt Franz Degenhardt ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Ort
    Köln
    Beiträge
    378
    Zitat Zitat von BigPepe Beitrag anzeigen
    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.
     
    Denken gefärdet die Gewohnheit

Ähnliche Themen

  1. Maus spielt verrückt
    Von IrealiTY im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 18.11.08, 12:36
  2. Sitemap spielt verrückt...
    Von flying-anzi im Forum XML Technologien
    Antworten: 2
    Letzter Beitrag: 19.07.07, 17:27
  3. VB spielt verrückt
    Von Mailyn im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 24.12.05, 13:23
  4. Eclipse spielt verrückt
    Von zeromancer im Forum Java
    Antworten: 4
    Letzter Beitrag: 30.05.04, 21:11
  5. Schattenmap spielt verrückt ....
    Von gilgamesch im Forum 3D Studio Max
    Antworten: 4
    Letzter Beitrag: 13.01.04, 14:49