2011-11-22 2 views
0

J'écris une petite application qui est censée refléter les mouvements effectués sur un autre téléphone lors d'un jeu de tetris. Cela fonctionne parfaitement pendant un petit moment, jusqu'à ce que j'obtienne une CorruptedStreamException côté serveur lors de l'écriture d'un objet.Android et sockets - CorruptedStreamException

Voici le code du serveur:

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){} 
    } 
} 

Je jette le code côté client aussi:

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){} 
    } 
} 

Et une trace de la pile peut être utile aussi, en pensant à ce :

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) 

Maintenant, pourquoi ai-je cette erreur? Autant que je sache, writeObject() ne devrait pas être capable de le lancer.

Répondre

0

Je ne suis pas vraiment sûr de la façon dont j'ai compris cela, mais il s'avère que le thread client n'a pas imprimé les erreurs qu'il a reçues (ceci n'explique pas pourquoi le côté serveur a jeté le corruptedStreamException). L'erreur résidait dans le fait que le client obtenait une exception OptionalDataException avec le champ de longueur défini sur 0 (indique la fin du flux). Je savais pertinemment que les writeObject étaient assez souvent appelés pour que cela ne pose aucun problème, j'ai donc décidé de réécrire une partie du code. La solution finale est vraiment trop simple, et voilà comment ma boucle while à côté du serveur ressemblait après la réécriture:

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

Il y a viritually aucune modification du côté client, donc je suppose que le taux de remises à zéro() en quelque sorte piétiné le flux.