Autore Topic: Eccezione java.lang.ArrayIndexOutOfBoundsException strana in comunic. socket  (Letto 515 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Salve ragazzi.
Ho un problema. Sto eseguendo su un server due thread nei quali ricevo dal client una stringa di comando e successivamente in base al comando dato eseguo un azione.
In particolare ricevo dal client due file xml.
In un caso non ho nessun problema. Il file viene correttamente ricevuto.
Nell'altro caso invece ho un eccezione molto strana dato che è esattamente tutto uguale al primo caso:

il codice è il seguente:
Codice (Java): [Seleziona]
int filesize=60223866; // filesize temporary hardcoded
                    int filesize2=60223865;
                    long start = System.currentTimeMillis();
                    int bytesRead;
                    int bytesRead2;
                    int current = 0;
                    int current2 = 0;
                 
                  Socket client = serverSocket.accept();
 
                          BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                      String str = in.readLine();

 if("TI INVIO LE AZIONI ESEGUITE".equals(str)){
                         System.out.println("S: CLIENT DICE: '" + str + "'");
                           //RICEZIONE NELLA CARTELLA DI LAVORO DEL FILE AZIONITOSERVER.xml DAL
                           //DISPOSITIVO MOBILE
                           byte [] mybytearray2  = new byte [filesize2];
                           InputStream is2 = client.getInputStream();
                           FileOutputStream fos2 = new FileOutputStream("AZIONITOSERVER.xml");
                           BufferedOutputStream bos2 = new BufferedOutputStream(fos2);
                           bytesRead2 = is2.read(mybytearray2,0,mybytearray2.length);
                           current2 = bytesRead2;

                           do {
                              bytesRead2 = is2.read(mybytearray2, current2, (mybytearray2.length-current2));
                              if(bytesRead2 >= 0) current2 += bytesRead2;
                           } while(bytesRead2 > -1);

                           bos2.write(mybytearray2, 0 , current2);
                           bos2.flush();
                           long end = System.currentTimeMillis();
                           System.out.println("S: SERVER DICE: LOGAZIONITOSERVER.XML RICEVUTO");
                           System.out.println("TEMPO IMPIEGATO RICEZIONE DA PARTE DEL SERVER DEL FILE LOGAZIONITOSERVER.XML: "+(end-start));
                           bos2.close();

}

if("TI INVIO LE QUANTITA COMPERATE".equals(str)){
                         System.out.println("S: CLIENT DICE: '" + str + "'");
                           //RICEZIONE NELLA CARTELLA DI LAVORO DEL FILE QUANTITATOSERVER.xml DAL
                           //DISPOSITIVO MOBILE
                           byte [] mybytearray  = new byte [filesize];
                           InputStream is = client.getInputStream();
                           FileOutputStream fos = new FileOutputStream("QUANTITATOSERVER.xml");
                           BufferedOutputStream bos = new BufferedOutputStream(fos);
                           bytesRead = is.read(mybytearray,0,mybytearray.length);
                           current = bytesRead;

                           do {
                              bytesRead = is.read(mybytearray, current, (mybytearray.length-current));
                              if(bytesRead >= 0) current += bytesRead;
                           } while(bytesRead > -1);

                           bos.write(mybytearray, 0 , current);
                           bos.flush();
                           long end = System.currentTimeMillis();
                           System.out.println("S: SERVER DICE: QUANTITATOSERVER.XML RICEVUTO");
                           System.out.println("TEMPO IMPIEGATO RICEZIONE DA PARTE DEL SERVER DEL FILE QUANTITATOSERVER.XML: "+(end-start));
                           bos.close();
                           }

L'eccezione che mi capita è:

java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at java.io.BufferedOutputStream.write(Unknown Source)
at agenda.bean.TCPDesktopServer.run(TCPDesktopServer. java:104)
at java.lang.Thread.run(Unknown Source)

dove la riga TCPDesktopServer.java:104 è la seguente:
bos2.write(mybytearray2, 0 , current2);

....quello che non capisco è come mai quando vado a togliere l'altra parte di codice che è identica a quella in questione a differenza della stringa di comando che viene inviata dal client e letta dal server (ma il resto è tutto uguale, in quanto ricevo un file e lo memorizzo alla stessa maniera) non mi viene generata l'eccezione e funziona in quanto mi ritrovo il file xml correttamente scritto, invece se lascio entrambe le parti mi si genera l'eccezione e uno dei due file xml ricevuti (quello per cui si genera l'eccezione risulta vuoto).
In base all'ordine di come nell'activity principale chiamo i due thread:
Codice (Java): [Seleziona]
        //!!!!!!!!!!!!THREAD COMUNICAZIONE CON IL SERVER!!!!!!!!!!!
        //INVIO FILE AZIONITOSERVER.XML CON LE AZIONI ESEGUITE PER ANDARE AD
        //AGGIORNARE LA TABELLA LOGAZIONI SUL DB DEL SERVER
        Thread cThread4 = new Thread(new TCPClientLogAzioni());
        cThread4.run();
        cThread4.stop();
                         
                                                                       
        //!!!!!!!!!!!!THREAD COMUNICAZIONE CON IL SERVER!!!!!!!!!!!
                //INVIO FILE QUANTITATOSERVER.XML CON LE QUANTITA COMPERATE PER ANDARE AD
                //AGGIORNARE LA DISPENSA
                Thread cThread3 = new Thread(new TCPClientQuantita());
                cThread3.run();
mi capita l'eccezione in entrambi i casi, o su uno o sull'altro caso a seconda del thread che viene eseguito per ultimo.
L'eccezione è sempre la stessa. bha...

Vi ringrazio come sempre
ciao
« Ultima modifica: 05 Dicembre 2010, 18:25:38 CET da Albe85 »