StreamCorruptedException с Android-Java-коммуникацией - PullRequest
1 голос
/ 29 апреля 2011

Мне нужно отправить сериализованные данные с устройства Android на сервер Java.Я не знаю почему, но общение кажется очень нестабильным.В отладчике java.io.StreamCorruptedException: генерируется сразу после запуска.ни один объект не проходит.Без отладчика передается почти 10 сообщений, пока не будет выдано то же исключение.Кто-нибудь есть идея, пожалуйста, помогите мне :) Спасибо!Fabian

Исключение:

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
            }

        }
    }

и нить андроида:

@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 Ответ

1 голос
/ 29 апреля 2011

Я могу себе представить, что Android и Java здесь не совсем совместимы с сериализацией. Так что одна сторона отправляет код, который другая не ожидает.

Я бы предпочел использовать более текстовый протокол (json, xml), чем сериализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...