Android и сокеты - CorruptedStreamException - PullRequest
0 голосов
/ 22 ноября 2011

Я пишу небольшое приложение, которое должно отражать движения, сделанные на другом телефоне во время игры в тетрис.Некоторое время он работает идеально, пока я не получу CorruptedStreamException на стороне сервера во время записи объекта.

Вот код для сервера:

public void run() {
    ServerSocket ss = null;
    Socket s = null;
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;
    try{
        ss = new ServerSocket(PORT);
        s = ss.accept();
        Log.i(TAG,"accepted");
        oos.flush();
        ois = new ObjectInputStream(s.getInputStream());
        while(run){
            busy=true;
            oos.writeObject(positions);
            busy = false;
            this.sleep(100);
            oos.reset();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{//close sockets!!
    try{
        ois.close();
        oos.close();
        s.close();
        ss.close();
    }catch(Exception e){}
    }
}

Я выброслюКод на стороне клиента тоже:

public void run() {
    Canvas c = null;
    Socket s = null;
    ObjectInputStream ois = null;
    ObjectOutputStream oos = null;
    try {
        Log.i(TAG, "it entered try");
        s = new Socket(IP, PORT);
        oos = new ObjectOutputStream(s.getOutputStream());
        oos.flush();
        ois = new ObjectInputStream(s.getInputStream());
        Log.i("try","has connected");
        while(run){
            blockList=(ArrayList<Posision>)ois.readObject();
            if(blockList!=null){
                try{
                    c=mSurfaceHolder.lockCanvas(null);
                    synchronized(mSurfaceHolder){
                        mTetrisView.drawTetris(c, blockList);
                    }
                }finally{
                    if(c!=null){
                        mSurfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }catch (EOFException ez){
        Log.i("catch", "End of file");
    } catch (Exception e) {
        Log.i("catch",e.getMessage());
        e.printStackTrace();
    }finally{//close socket!!
        try{
            ois.close();
            oos.close();
            s.close();
        }catch(IOException e){}
    }
}

И трассировка стека также может пригодиться, если подумать:

java.io.StreamCorruptedException
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1712)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1665)
at com.prosjekt.tetris2.ServerThread.run(ServerThread.java:42)

Теперь, почему я получаю эту ошибку?Насколько я знаю, writeObject () не может его выбросить.

1 Ответ

0 голосов
/ 23 ноября 2011

Я не совсем уверен, как я это выяснил, но оказывается, что клиентский поток не распечатывал ошибки, которые он получил (однако это не объясняет, почему серверная сторона выдает исключение поврежденныйStreamException).Ошибка состояла в том, что клиент получил исключение OptionalDataException с полем длины, установленным в 0 (указывает на конец потока).Я точно знал, что writeObject вызывался достаточно часто, чтобы это не было проблемой, поэтому я решил переписать часть кода.Окончательное исправление на самом деле слишком простое, и вот как мой цикл while на стороне сервера выглядел после переписывания:

while(run){
    oos.writeObject(new ArrayList<Posisions>(positions));
    oos.flush();
}

На стороне клиента практически нет изменений, поэтому я предполагаю, что скорость сброса ()как-то растоптал поток.

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