2010-04-12 11 views
9

클라이언트 - 서버 응용 프로그램은, 지금은 해결하는 방법을 잘 모릅니다 문제에 직면 미안 writen 메신저자바 잘못된 스트림 헤더 문제

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)에서

단지 while (!mensajeRecibido.lastMessage);

모든 아이디어 후 첫 번째 코드에서이 줄 ObjectInputStream is = new ObjectInputStream(bs);입니까?

답변

7

20646520은 ASCII @A입니다.

ObjectInput/OutputStreams는 스트림의 시작 부분에서 객체의 특수한 직렬화를 준수한다는 것을 나타 내기 위해 "마술"값을 사용합니다. (나는 이것이 0xCAFEBABE이라고 생각한다.)

이것은 당신의 상황에서 ObjectInputStream이 마법을 읽을 기회가 있거나 그 스트림이 생산되지 않았기 때문에 이미 스트림을 읽었다는 것을 의미한다. ObjectOutputStream에 의해

당신은 mensajeRecipido.fileContent을 사용하기 때문에, 지금까지 내가 말할 수있는 등의 ObjectOutputStream에 의해 생성되지 않은 바이트 배열 인 변수 by wig를 할당 (또는 추가). 나는 mensajeRecipido.fileContent이 실제 파일의 내용이라고 생각합니다. 이 실행중인 인스턴스에서 ObjectOutputStream과 같은 형식이 아니므로 스트림 머리글 예외가 발생합니다.

+0

답장을 보내 주셔서 감사합니다. mensajeRecibido.filecontent는 보낸 사람 코드에서 가져온 메시지의 내용입니다. 내 관점에서 볼 때 같은 형식으로되어 있다고 생각하지만, 그 진술을 이해하지 못했거나 내가 무엇을해야 하는지를 잘 모르겠다. 감사합니다 : D –

+0

아직 문제를 해결하는 방법에 대한 아이디어가 없습니다. S –

+0

"Cafe Babe", 멋진 lol – Xenalin