2010-01-31 6 views
1

Je construis une application client-serveur. Maintenant, je veux transmettre le message d'un client à tous les autres clients avec ce code:En-tête de flux invalide Java: 7371007E

ArrayList<User> usrs = _usrHandler.getUsers(); 
for(User usr : usrs) { 
    if(!usr.getSocket().equals(_connection)) { 
     usr._oOut.writeObject(new CommunicationMessage(this._comMsg.getMessage(), CommunicationMessage.MSG, 
                this._comMsg.getUser())); 
} 
} 

Sur le côté client du programme est à l'écoute des messages. Il lance cette exception:

java.io.StreamCorruptedException: invalid stream header: 7371007E 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) 
    at Connection$MessageListener.run(Connection.java:126) 
    at java.lang.Thread.run(Thread.java:637) 

MessageListener:

   while(this._loop) { 
this._comMsg = (CommunicationMessage) this._dataInput.readObject(); 

SimpleAttributeSet attr = new SimpleAttributeSet(); 
attr.addAttribute(StyleConstants.CharacterConstants.Bold, Boolean.TRUE); 
attr.addAttribute(StyleConstants.CharacterConstants.Foreground, _comMsg.getUser().getColor()); 

messageClient.addMessage(_comMsg.getUser().getNickName() + ": ", attr); 
messageClient.addMessage(_comMsg.getMessage(), _comMsg.getUser().getColor()); 

_comMsg = null; 
} 

Est-ce que quelqu'un voit l'erreur?

Répondre

5

Vous avez probablement vos flux dans une torsion.

Lorsque vous construisez un ObjectInputStream, le constructeur lit les deux premiers octets du flux en leur demandant d'être les «valeurs magiques» qui devraient être présentes dans un flux d'objets. Si elles ne sont pas là, il lance le StreamCorruptedException (tout est dans le code source ObjectInputStream).

Il semblerait donc que vous encapsuliez un InputStream dans un ObjectInputStream alors qu'en fait les données descendant de l'autre extrémité de la connexion ne sont pas réellement un flux d'objets. Peut-être qu'il envoie encore des données d'une communication précédente.

+2

Je vois maintenant mon erreur. J'ai changé la façon de construire le thread d'écoute, mais je n'ai pas réalisé que 'InputStream' était encore construit dans la méthode run(). Merci! – dododedodonl