2016-04-24 8 views
0

In meiner App sende ich eine Datei von einem Client, mit Sockets. Auf der anderen Seite erhält ein anderer Client die Datei mit InputStream und dann bufferedOutputStream speichert die Datei im System.InputStream.read() hängt beim Lesen einer Datei

Ich weiß nicht warum, die Datei ist nicht vollständig übertragen. Ich denke, das ist wegen Netzwerküberlastung, ich weiß sowieso nicht, wie ich es lösen soll.

Transmiter ist:

Log.d(TAG,"Reading..."); 
       bufferedInputStream.read(byteArrayFile, 0, byteArrayFile.length); 
       Log.d(TAG, "Sending..."); 
       bufferedOutputStream.write(byteArrayFile,0,byteArrayFile.length); 

bufferedOutputStream.flush(); 

Receiver ist:

bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(file)); 
          byteArray=new byte[fileSize]; 

          int currentOffset = 0; 

          bytesReaded = bufferedInputStream.read(byteArray,0,byteArray.length); 
          currentOffset=bytesReaded; 

          do { 
           bytesReaded = bufferedInputStream.read(byteArray, currentOffset, (byteArray.length-currentOffset)); 
           if(bytesReaded >= 0){ currentOffset += bytesLeidos; 
           } 
          } while(bytesReaded > -1 && currentOffset!=fileSize); 


          bufferedOutputStream.write(byteArray,0,currentOffset); 
+0

versuchen, den Wert von bytesReaded zu protokollieren und zu sehen, wie es geht – AdamSkywalker

+0

In der Regel empfiehlt es sich, mit Ihrem Debugger schrittweise zu gehen und Variablenwerte zu überprüfen. –

+0

Ich habe es schon einmal gemacht. Wenn die Datei z. B. 10000 Byte enthält, bleibt sie hängen, wenn sie 9000 Byte empfangen hat. –

Antwort

3

Sie erklären nicht, wo filesize herkommt, aber es gibt zahlreiche Probleme mit diesem Code. Zu viele, um es zu erwähnen. Werfen Sie alles weg und verwenden Sie DataInputStream.readFully(). Oder verwenden Sie die folgende Kopierschleife, die nicht die Größe des Dateipuffers erfordert, eine Technik, die nicht davon ausgegangen, skaliert, dass die Dateigröße paßt in ein int, und fügt Latenz:

byte[] buffer = new byte[8192]; 
int count; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

Verwenden dieser An beiden Enden. Wenn Sie mehrere Dateien über die gleiche Verbindung senden, wird es komplexer, aber Sie haben das nicht gesagt.

+0

In Ihrer Schleife wäre "in" Variable ein "InputStream"? –

+0

@MMManuel Natürlich, und "out" wäre ein 'OutputStream'. Ich hätte nicht gedacht, dass das nötig wäre. – EJP

+0

Sollte bei "count" bei jedem write-Ereignis nicht der Offset erhöht werden? –