2010-06-30 5 views
-2

Aujourd'hui, j'ai un problème avec un ObjectStream (entrée et sortie). J'ai utilisé l'Input et le OutputStream qui sont sortis directement du socket. Pendant l'initialisation des flux, mes courses, mes courses et mes courses sont en cours. Sans message d'erreur Je n'ai reçu aucun message d'erreur. Il semble que le constructeur de l'ObjectInputStream s'exécute sans fin ...Crash ObjectStream

Voici le code où le problème existe. Socket.isConnected était true.

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 

Des idées?

+2

Pourriez-vous décrire exactement ce qu'est l'erreur lorsque vous rencontrez le problème? – Pace

+0

il n'y a pas de crash. le programme s'exécute sans fin dans le constructeur objectinputstream ... – Moritz

+0

alors pourquoi vous l'avez écrit se bloque? – RoflcoptrException

Répondre

0

Le flux d'entrée d'objet lit l'en-tête envoyé par le flux de sortie d'objet qui est construit. Si vous n'avez pas envoyé l'en-tête, il attendra pour toujours.

La solution simple est de TOUJOURS créer le flux de sortie de l'objet en premier et le vider avant de créer le flux d'entrée de l'objet.

+0

merci, je vais essayer cette solution! – Moritz

0

J'ai trouvé ce

Créer ObjectOutputStream Avant ObjectInputStream Si vous écrivez du code qui transmet des données en utilisant les deux sens ObjectInputStream et ObjectOutputStream, faites attention à construire la première ObjectOutputStream.

Si vous construisez à la place le ObjectInputStream en premier lieu, les deux extrémités vont bloquer et finalement échouer dans le constructeur. Cela est dû au fait que le constructeur du flux d'entrée attend une chaîne initiale d'octets provenant de ObjectOutputStream open(). Dans le cas unidirectionnel, où un côté écrit et l'autre est en train de lire, tout se passe bien. Cependant, dans le cas bidirectionnel, si les deux parties tentent de construire le flux d'entrée en premier, les deux attendent que l'autre construise le flux de sortie, et aucune des deux ne peut continuer. Si votre gestion des exceptions permet aux communications de continuer après la construction du flux d'entrée échoue, alors les symptômes de ce problème sont que les deux côtés se bloquent pendant un certain temps, on obtient l'exception et poursuit la construction du ObjectOutputStream. L'autre extrémité est alors capable de construire son ObjectInputStream, puisque la séquence d'initialisation vient d'arriver.

Heureusement, la correction est simple. Déplacez la création de ObjectOutputStream avant celle de ObjectInputStream. Ensuite, chaque extrémité transmettra la séquence d'initialisation avant d'essayer d'ouvrir son flux d'entrée. La séquence d'initialisation est prête et en attente, de sorte que la construction du flux d'entrée se passe normalement, et les transferts d'objets peuvent alors commencer sans délai.