2011-04-29 26 views
1

我需要將序列化數據從Android設備發送到Java服務器。 我不知道爲什麼,但溝通似乎很不穩定。在調試器中,java.io.StreamCorruptedException:在啓動後立即拋出。沒有一個對象正在傳遞。 如果沒有調試器,則會傳遞近10條消息,直到引發相同的異常。 任何人都有想法,請幫助我:) 謝謝! 費邊StreamCorruptedException與Android-Java通信

例外:

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) 

的java代碼:

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 
      } 

     } 
    } 

和Android的線程:

@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

我可以想像,Android和Java的不完全序列化兼容這裏。所以一方會發送另一方不期望的代碼。

我寧願在這裏使用更多的文本協議(json,xml),而不是使用序列化。

+0

嗯......好的,「Nachricht」不是那麼大,只包含2個字符串和一個Float的ArrayList。用所有信息創建一個字符串並不會有太大麻煩。我只是不明白爲什麼它「有時」起作用。在線程開始之前,android已經發送了另一個對象的ArrayList,它的工作原理是正確的,直到Thread開始。我會嘗試與字符串,謝謝。 – fabi 2011-04-29 15:25:30