2010-04-12 3 views
9

им прописан приложение клиент-сервер, и теперь i'm столкнулись с проблемой, что я не знаю, как решить:Java заголовок некорректный поток Проблема

Это клиент:

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++; 

     } 

И это является отправителем:

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(); 
    } 
} 

И это журнал регистрации ошибок:

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) 

Где в org.tockit.comunication.ServerThread.enviaFicheroMultiple(ServerThread.java:747) эта линия ObjectInputStream is = new ObjectInputStream(bs); на 1-й код только после того, как while (!mensajeRecibido.lastMessage);

Любые идеи?

ответ

7

Значение 20646520 есть в ASCII @A.

ObjectInput/OutputStreams использует «магическое» значение в начале потока, чтобы указать, что оно соответствует специальной сериализации объектов. (Я думаю, это был 0xCAFEBABE, но я не уверен)

Это означает, что в вашей ситуации что-то уже прочитало поток до того, как ObjectInputStream имеет возможность прочитать магию или что поток, который он читает, не является продуктом с помощью ObjectOutputStream;

присваивается переменной by к wig (или добавить), который представляет собой массив байт, который не порождается ObjectOutputStream, насколько я могу судить, так как он использует mensajeRecipido.fileContent. Предполагаю, mensajeRecipido.fileContent - это содержимое фактического файла. В этом запущенном экземпляре нет того же формата, что и ObjectOutputStream, и именно поэтому вы получаете исключение заголовка потока.

+0

Благодарим вас за ответ. mensajeRecibido.filecontet исходит из кода отправителя, его содержимого отправляемых сообщений. Я думаю, что его такой же формат с моей точки зрения, но его очень возможно, что я не разбираюсь в вашем заявлении или знаю, что мне делать. Спасибо: D –

+0

Пока не знаю, как решить проблему: S –

+0

"Cafe Babe", nice lol – Xenalin

Смежные вопросы