2012-04-14 5 views
1

Ich habe einen Fall, in dem der Server die Dateigröße zuerst und die Dateidaten sendet. Wie kann ich beim Lesen auf der Clientseite sowohl den Ganzzahlwert als auch die Dateidaten unterscheiden?Unterscheidung zwischen den Datenpaketen in TCP IP

Sameple Code für Server (os ist die BufferedOutputStream):

  // Construct a 1K buffer to hold bytes on their way to the socket. 
      byte[] mybytearray = new byte[(int) myFile.length()]; 

      //File Size 
      os.write((int) myFile.length()); 

    FileInputStream fis = null; 
    System.out.println("test+sendbytes"); 
    // Copy requested file into the socket's output stream. 
     try { 
      fis = new FileInputStream(myFile); 
     } catch (FileNotFoundException ex) { 
      // Do exception handling 
     } 
     BufferedInputStream bis = new BufferedInputStream(fis); 

     try { 
      bis.read(mybytearray, 0, mybytearray.length); 
      os.write(mybytearray, 0, mybytearray.length); 
      os.flush(); 
      os.close(); 
      os.close(); 

      // File sent, exit the main method 
      return; 
     } catch (IOException ex) { 
      // Do exception handling 
     } 
+0

'os.write ((int) myFile.length())' ist * falsch * wie in Peter Lawreys Antwort darauf hingewiesen. Es schreibt ein einzelnes Byte mit dem Wert 'myFile.length() & 0xFF'. Außerdem ist der Aufruf von 'os.flush()' unmittelbar vor 'os.close()' unnötig. 'close()' löscht immer alle verbleibenden Daten in einer der Kern-IO-Klassen. –

Antwort

1

Sie müssen die Länge als int schreiben, wenn Sie alle Dateien Arfe nicht mehr als 255 Bytes lang gehen davon aus. Versuchen Sie DataOutputStream.writeInt()

Für das Lesen müssen Sie eine Bestellung übernehmen. Dh Sie gehen davon aus, dass zuerst die Länge und dann der Inhalt gesendet wird. Verwenden Sie DataInputStream.readInt(), um die Länge zu lesen.

+0

Danke Peter. Ich sende eine Datei der Größe 4 MB. Also, wenn ich mit Datainputstream.readInt() zu einer Variablen lesen, speichert es es auf diese Variable intger? – DesperateLearner

+0

Ja, ein 'int'-Feld, das die Länge zum Lesen hat. Sie können dies verringern, wenn Sie Teile der Daten gleichzeitig lesen. –