2010-04-12 11 views
9

im लिखा एक क्लाइंट-सर्वर अनुप्रयोग, और अब एक समस्या यह है कि मैं जानता हूँ कि हल करने के लिए कैसे न सामना करना पड़ रहा मैं:जावा अमान्य धारा हैडर समस्या

इस ग्राहक है:

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) पर 1 कोड पर इस लाइन ObjectInputStream is = new ObjectInputStream(bs); सिर्फ while (!mensajeRecibido.lastMessage);

कोई भी विचार के बाद है?

उत्तर

7

मूल्य 20646520 ASCII @A में है।

ऑब्जेक्ट इनपुट/आउटपुटस्ट्रीम स्ट्रीम की शुरुआत में एक "जादू" मान का उपयोग करते हैं, यह इंगित करने के लिए कि यह वस्तुओं के विशेष क्रमिकरण का अनुपालन करता है। (मुझे लगता है कि यह 0xCAFEBABE था, लेकिन मुझे यकीन नहीं है)

इसका मतलब यह है कि ऑब्जेक्टइनपूटस्ट्रीम को जादू पढ़ने का मौका मिलने से पहले कुछ स्ट्रीम पहले ही पढ़ चुकी है, या जिस धारा को पढ़ता है वह उत्पादित नहीं होता है ऑब्जेक्टऑटपुटस्ट्रीम द्वारा;

आप चर bywig को असाइन (या संलग्न) है, जो एक बाइट सरणी जो, एक ObjectOutputStream द्वारा उत्पन्न नहीं है, जहाँ तक मैं बता सकता है, क्योंकि यह mensajeRecipido.fileContent का उपयोग करता है। मुझे लगता है कि mensajeRecipido.fileContent एक वास्तविक फ़ाइल की सामग्री है। इस चल रहे इंस्टेंस में ऑब्जेक्टऑटपुटस्ट्रीम के समान प्रारूप का नहीं है, और यही कारण है कि आपको स्ट्रीम हेडर अपवाद मिलता है।

+0

आपके उत्तर के लिए धन्यवाद। mensajeRecibido.filecontet प्रेषक कोड से आता है, जो संदेश मैं भेजता हूं उसकी सामग्री। मुझे लगता है कि यह मेरे दृष्टिकोण से एक ही प्रारूप का है, लेकिन यह बहुत ही सकारात्मक है कि मैं आपके बयान को समझ नहीं पा रहा हूं या जानता हूं कि मुझे क्या करना चाहिए। धन्यवाद: डी –

+0

समस्या का समाधान करने के बारे में अभी तक कोई विचार नहीं है: एस –

+0

"कैफे बेबे", अच्छा लॉल – Xenalin

संबंधित मुद्दे