2010-04-12 18 views
9

im writen aplikacja typu klient-serwer, a teraz jestem w obliczu problemu, że nie wiem, jak rozwiązać:Java nieprawidłowy stream header Problem

To klient:

try 
     { 

      Socket socket = new Socket(ip, port); 


      ObjectOutputStream ooos = new ObjectOutputStream(socket 
        .getOutputStream()); 
      SendMessage message = new SendMessage(); 

      message.numDoc = value.numDoc; 
      message.docFreq = value.docFreq; 

      message.queryTerms = query; 
      message.startIndex = startIndex; 
      message.count = count; 
      message.multiple = false; 
      message.ips = null; 
      message.ports = null; 

      message.value = true; 
      message.docFreq = value.docFreq; 
      message.numDoc = value.numDoc; 
      ooos.writeObject(message); 


      ObjectInputStream ois = new ObjectInputStream(socket 
        .getInputStream()); 
      ComConstants mensajeRecibido; 
      Object mensajeAux; 
      String mensa = null; 

      byte[] by = null; 

      do 
      { 

       mensajeAux = ois.readObject(); 

       if (mensajeAux instanceof ComConstants) 
       { 


        System.out.println("Thread by Thread has Search Results"); 

        String test; 

        ByteArrayOutputStream testo = new ByteArrayOutputStream(); 

        mensajeRecibido = (ComConstants) mensajeAux; 

        byte[] wag; 

        testo.write(
          mensajeRecibido.fileContent, 0, 
          mensajeRecibido.okBytes); 

        wag = testo.toByteArray(); 


        if (by == null) { 

         by = wag; 

        } 
        else { 

         int size = wag.length; 

          System.arraycopy(wag, 0, by, 0, size); 
        } 


       } else 
       { 

        System.err.println("Mensaje no esperado " 
          + mensajeAux.getClass().getName()); 
        break; 
       } 
      } while (!mensajeRecibido.lastMessage); 




      //ByteArrayInputStream bs = new ByteArrayInputStream(by.toByteArray()); // bytes es el byte[] 
      ByteArrayInputStream bs = new ByteArrayInputStream(by); 
      ObjectInputStream is = new ObjectInputStream(bs); 
      QueryWithResult[] unObjetoSerializable = (QueryWithResult[])is.readObject(); 
      is.close(); 

      //AQUI TOCARIA METER EL QUICKSORT 

      XmlConverter xce = new XmlConverter(unObjetoSerializable, startIndex, count); 
      String serializedd = xce.runConverter(); 



     tempFinal = serializedd; 

      ois.close(); 
      socket.close(); 

     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     i++; 

     } 

I jest nadawca:

try 
    { 

     QueryWithResult[] outputLine; 

     Operations op = new Operations(); 

     boolean enviadoUltimo=false; 

     ComConstants mensaje = new ComConstants(); 
     mensaje.queryTerms = query; 

     outputLine = op.processInput(query, value); 

     //String c = new String(); 
     //c = outputLine.toString(); 
     //StringBuffer swa = sw.getBuffer(); 

     ByteArrayOutputStream bs= new ByteArrayOutputStream(); 

     ObjectOutputStream os = new ObjectOutputStream (bs); 
     os.writeObject(outputLine); 
     os.close(); 

     byte[] mybytearray = bs.toByteArray(); 

     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mybytearray); 

     BufferedInputStream bis = new BufferedInputStream(byteArrayInputStream); 

     int readed = bis.read(mensaje.fileContent,0,4000); 


     while (readed > -1) 
     { 


      mensaje.okBytes = readed; 


      if (readed < ComConstants.MAX_LENGTH) 
      { 
       mensaje.lastMessage = true; 
       enviadoUltimo=true; 
      } 
      else 
       mensaje.lastMessage = false; 

      oos.writeObject(mensaje); 


      if (mensaje.lastMessage) 
       break; 

      mensaje = new ComConstants(); 
      mensaje.queryTerms = query; 

      readed = bis.read(mensaje.fileContent); 
     } 

     if (enviadoUltimo==false) 
     { 
      mensaje.lastMessage=true; 
      mensaje.okBytes=0; 
      oos.writeObject(mensaje); 
     } 

     oos.close(); 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

I to jest dziennik błędów:

Thread by Thread has Search Results 
java.io.StreamCorruptedException: invalid stream header: 20646520 
at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
at java.io.ObjectInputStream.<init>(Unknown Source) 
at org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.java:747) 
at org.tockit.comunication.ServerThread.run(ServerThread.java:129) 
at java.lang.Thread.run(Unknown Source) 

Gdzie na org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.java:747) jest ta linia ObjectInputStream is = new ObjectInputStream(bs); na 1 kodu tuż po while (!mensajeRecibido.lastMessage);

Jakieś pomysły?

Odpowiedz

7

Wartość 20646520 znajduje się w ASCII @A.

ObjectInput/OutputStreams używają "magicznej" wartości na początku strumienia, aby wskazać, że jest ona zgodna ze specjalną serializacją obiektów. (Myślę, że to było 0xCAFEBABE, ale nie jestem pewien)

Oznacza to w twojej sytuacji, że coś już przeczytało strumień, zanim ObjectInputStream ma szansę odczytać magię, lub że strumień, który czyta, nie jest produkowany przez ObjectOutputStream;

przypisać zmienną by do wig (lub dołączyć), która jest tablicą bajtów, które nie są generowane przez ObjectOutputStream, o ile mogę powiedzieć, ponieważ używa mensajeRecipido.fileContent. Zakładam, że mensajeRecipido.fileContent jest zawartością rzeczywistego pliku. W tej uruchomionej instancji nie ma tego samego formatu, co obiekt ObjectOutputStream, i dlatego otrzymujemy wyjątek nagłówka strumienia.

+0

Dziękuję za odpowiedź. mensajeRecibido.filecontet pochodzi z kodu nadawcy, jego treść wiadomości wysyłam. Myślę, że jest to ten sam format z mojego punktu widzenia, ale jest bardzo prawdopodobne, że nie podważam twojego oświadczenia lub wiem, co powinienem zrobić. Dzięki: D –

+0

Nie mam jeszcze pomysłu, jak rozwiązać problem: S –

+0

"Cafe Babe", miła lol – Xenalin

Powiązane problemy