2016-06-16 2 views
0

Ich habe Probleme beim Schreiben einer Server-Client-Kommunikation, bei der eine Bitmap als Daten übergeben wird.So informieren Sie den Client, dass die Daten fertig sind, ohne den Socket zu schließen

Bei meiner Server-Seite Ich habe

InputStream in = rs.getBinaryStream(1); 
         ByteArrayOutputStream f2 = new ByteArrayOutputStream(); 
         int c = 0; 
         while ((c = in.read()) > -1) { 
          f2.write(c); 
         } 
         bytes = f2.toByteArray(); 
         username2.write(bytes, 0, bytes.length); 

Und an meinem Android-Client, ich habe

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      final byte[] buffer = new byte[2048]; 
      int read = -1; 

      while ((read = receiveimagem.read(buffer)) != -1) { 
       out.write(buffer, 0, read); 
      } 

Das Problem ist, nur der Kunde versteht, dass das Senden über ist, wenn ich der output schließen auf der Serverseite. Aber die Struktur ist innerhalb einer Schleife und wenn ich den Socket schließe, wird es nicht wieder funktionieren. Wie kann ich dem Kunden mitteilen, dass die Daten abgelaufen sind? Der Code bleibt im Android-Client hängen. Ich weiß, dass ich die Länge senden und überprüfen sollte, aber ich weiß nicht, wie man die Länge benutzt, um das Ende der Datei zu überprüfen.

Antwort

-1

Ihr Hauptproblem bei der Übertragung der Bildlänge an den Client besteht darin, dass der Server selbst die Länge der Eingabe nicht kennt, bevor die Übertragung des Bilds beginnt. Der Server sollte zuerst das gesamte Bild in einen Puffer lesen und dann die Länge des Puffers an den Client senden. Der Client kann dann eine for-Schleife ausführen, wobei er die empfangene Größe in der Bedingung der for-Schleife verwendet. Eine bessere Lösung wäre, dass der Client das gesamte Bild in einem Aufruf liest, sodass Sie den Client nicht erneut einbinden müssen. Es kann und sollte im Allgemeinen vermieden werden, I/O Byte für Byte auszuführen. Denken Sie auch daran, beide Ausgangsströme zu spülen!

+0

Das Lesen in einem Anruf löst dieses Problem nicht. Ein Lesevorgang kann nur ein Byte gleichzeitig übertragen. Es ist nicht garantiert, den Puffer zu füllen. – EJP

+0

Ich habe versucht, die ByteArray-Größe durch bytes.length zu erhalten und es an den Client zu senden. Auf der Client-Seite, nach der Größe, wie kann ich diese for-Schleife machen? –

+0

Danke. Wenn Sie lesen, was Sie gesagt haben, könnte ich mit einer Lösung herauskommen. Einfach gemacht für (int i = 0, i <(Länge vom Server bekommen), i ++). Ich danke dir sehr. Auch gemacht endgültiges Byte [] Puffer = neues Byte [1]; so kann ich es einzeln zählen –