Autore Topic: Sincronizzazione fra server e client via socket  (Letto 404 volte)

Offline Ilgard

  • Utente junior
  • **
  • Post: 64
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Xperia M
  • Sistema operativo:
    Ubuntu 14.04
Sincronizzazione fra server e client via socket
« il: 05 Agosto 2014, 13:25:04 CEST »
0
Salve, ho un problema con la corretta ricezione di dati da parte di un client Android, dati inviati da un server Java.
Inserisco le parti rilevanti del codice:
Server
Codice (Java): [Seleziona]
for ( File f : files ){
                if ( !(f.getName().equalsIgnoreCase("logo.jpg"))){
                        System.out.println("Invio file " + f.getName());

                        bos = new ByteArrayOutputStream();
                        img = ImageIO.read(f);
                        ImageIO.write( img, "png", bos );

                        imageInByte = bos.toByteArray();
                        bos.close();

                        out.writeInt(imageInByte.length);
                        out.flush();

                         out.write(imageInByte);
                        out.flush();
                       
                        boolean go = false;
                        while (!go){
                                 String s = in.readUTF();
                                if ( s.equals("OK")) go = true;
                                else System.out.println("no " + s);
                        }
                        System.out.println("OK");
                }

}

Client
Codice (Java): [Seleziona]
l = in.readInt();
        for (i = 0; i < l; i++){
                try {
                        int temp = in.readInt();
                        Log.v("tag", "temp = " + temp);

                        buffer = new byte[temp];
                        in.read(buffer);

                        bitmapArray[i] = BitmapFactory.decodeByteArray(buffer, 0, buffer.length);

                        out.writeUTF("OK");
                        out.flush();

                        Thread.sleep(1000);
                }
                catch (IOException e) {Log.v("asd", "", e.fillInStackTrace());} catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}

Allora, il server deve inviare al client l immagini. Le immagini vengono convertite in array di byte e poi convertite in Bitmap dal client. Per prima cosa invio la dimensione dell'array e poi invio l'immagine in sé.
Fin qui non ci sono problemi, la prima immagine viene ricevuta correttamente. Al secondo ciclo però, la lettura della dimensione dell'immagine (temp) risulta completamente sbagliata (tipo -4 milioni). Ho provato a mettere in pausa il client per un secondo per vedere se riusciva a leggere i dati correttamente ma è stato inutile.
Sapete come posso fare per sincronizzare correttamente le letture con le scritture? Oppure se ci sia un modo per rendere le letture bloccanti (cioè con attesa attiva finché non si riceve un messaggio).

Post unito: 05 Agosto 2014, 18:05:09 CEST
Ho trovato l'errore: nel client dovevo usare readFully invece di read per la lettura dell'array.
« Ultima modifica: 05 Agosto 2014, 18:05:10 CEST da Ilgard, Reason: Merged DoublePost »