web-dev-qa-db-ja.com

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);の直後の最初のコードのこの行while (!mensajeRecibido.lastMessage);です。

何か案は?

9
David zsl

20646520はASCII @Aにあります。

ObjectInput/OutputStreamsは、ストリームの先頭で「マジック」値を使用して、オブジェクトの特別なシリアル化に準拠していることを示します。 (これは0xCAFEBABEだったと思いますが、よくわかりません)

これは、ObjectInputStreamがマジックを読み取る前に、何かがすでにストリームを読み取ったか、読み取ったストリームがObjectOutputStreamによって生成されていないことを意味します。

変数bywig(または追加)に割り当てます。これは、mensajeRecipido.fileContentを使用するため、私が知る限り、ObjectOutputStreamによって生成されないバイト配列です。 。 mensajeRecipido.fileContentは実際のファイルの内容だと思います。この実行中のインスタンスはObjectOutputStreamと同じ形式ではないため、ストリームヘッダーの例外が発生します。

6
Pindatjuh