2011-04-29 86 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