2011-04-29 5 views
1

Android 기기에서 Java 서버로 직렬화 된 데이터를 보내야합니다. 이유는 모르겠지만 의사 소통은 매우 불안정한 것으로 보입니다. 디버거에서 java.io.StreamCorruptedException :은 시작 직후에 발생합니다. 하나의 객체가지나 가지 않습니다. 디버거가 없으면 동일한 예외가 throw 될 때까지 약 10 개의 메시지가 전달됩니다. 누구나 아이디어가 있으니 도와주세요 :) 고마워요! 파비안Android-Java 통신을 통한 StreamCorruptedException

예외 :

java.io.StreamCorruptedException: invalid type code: 2F 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at androidAnbindung.AndroidVerwalter.run(AndroidVerwalter.java:114) 

자바 코드 :

public void Nachrichtenaustausch(){ 
    port ++; 
    try { 
     serverSocket = new java.net.ServerSocket(port); 
     System.out.println("Warte auf 2. Verbindungsaufbau..."); 
     client = serverSocket.accept(); 
     System.out.println("Verbindung 2 ist eingegangen..."); 
     in = new ObjectInputStream(new ObjectInputStream(client.getInputStream())); 
     Nachricht n; 
     // starte den regulären Verkehr mit dem Androidgerät 
     new Thread(this).start(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

@Override 
    public void run() { 
     Nachricht speicher; 
     while (true) { 
      try { 

       speicher = (Nachricht) in.readObject(); 
       if (speicher != null) { 
        System.out.println(speicher.getName()+"..............................."+speicher.getWerte().get(0)); 
       }synchronized (objekliste) { 
        for (AndroidObject ao : this.objekliste) { 
         if (speicher.getName().equals(ao.name)) { 
          ao.abstrakter_Wert = speicher.getAktuellerWert(); 
          if (speicher.getWerte()!=null) { 
           ao.werte = speicher.getWerte(); 

          } 
         } 
        } 
       } 
       Thread.sleep(50); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }catch (Exception e) { 
       // TODO: handle exception 
      } 

     } 
    } 

및 안드로이드 스레드 :

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    try { 
     while (true) { 
      if (!nachrichtenliste.isEmpty()) { 
       Nachricht speicher = nachrichtenliste.get(0); 
       try { 
        out.writeObject(speicher); 
        out.flush(); 
        synchronized (nachrichtenliste) { 
         nachrichtenliste.remove(speicher); 
        } 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      Thread.sleep(50); 
      handler.post(this); 
     } 


    } catch (Exception e) { 
     // TODO: handle exception 
    }  
} 

답변

1

나는 안드로이드와 자바 정확히 호환 직렬화 아니라는 것을 상상할 수 이리. 그래서 한 쪽에서 다른 쪽이 기대하지 않는 코드를 보냅니다.

여기 직렬화를 사용하는 것보다 더 많은 텍스트 프로토콜 (json, xml)을 사용하고 싶습니다.

+0

음 ... 좋아요, "Nachricht"는 그다지 크지 않습니다. 2 개의 문자열과 수레 목록 만 포함합니다. 모든 정보가 포함 된 String을 만드는 것이 그리 큰 문제는 아닐 것입니다. 나는 왜 그것이 때때로 "때때로"또는 처음에는 효과가 없는지 알지 못합니다. Thread가 시작되기 전에 android는 이미 다른 Object의 ArrayList를 보내고 Thread가 시작될 때까지 올바르게 작동합니다. 나는 String으로 시도 할 것이다, 고마워. – fabi

관련 문제