2009-11-22 5 views
1

J'ai écrit un EchoServer qui répond avec la chaîne ACK si les données ont été envoyées en conséquence.ObjectInputStream et ObjectOutputStream

Mon client ressemble à ceci ... Afin de recevoir la réponse ack du serveur, "echoSocket" place les données reçues dans mon ObjectInputStream. Seulement si je commente ces pièces sur le client fonctionne

 echoSocket = new Socket(server_name, tcp_port); 
     System.out.println(" *** Connected to " + server_name + " ***"); 
     System.out.println("Press Enter to send your message."); 

     out = new ObjectOutputStream(echoSocket.getOutputStream()); 
     in = new ObjectInputStream(echoSocket.getInputStream()); 

     out.flush(); 

     String message = System.console().readLine(); 

     while(!message.equals("quit")) { 


      // problem     
      if (in.readObject().equals(ack)) 
       System.out.println("ACKed"); 
      in.close(); 
      // problem ends 
      out.flush(); 

      out.writeObject(message); 
      System.out.println("Sending: " + message);  
      message = System.console().readLine(); 
      out.flush(); 

     } 

Est-ce que quelqu'un sait pourquoi il n'enverra pas mes cordes?

Merci, Marius

+0

Est-ce que ack est censé être un littéral de chaîne? Remplacez: if (in.readObject(). Equals ("ack")) – barrowc

Répondre

3

Utilisation des flux d'objets sur des sockets est pas vraiment une idée recommandée. Vous pourriez envisager un service Web complet, ou RMI.

Cela peut fonctionner mieux si vous lisez dans un tampon et assurez-vous que vous disposez de toute l'activité avant d'essayer de désérialiser avec les flux d'objets.

+2

RMI est très cher. Parfois, les flux + sockets sont une meilleure solution. –

+0

Cela * ne fonctionnera pas mieux si vous lisez dans un tampon - alors vous devrez gérer vous-même les limites des objets. Mais l'insertion d'un BufferedInputStream signifie moins d'appels à l'appel système en lecture au niveau du système d'exploitation. Les tests de ce type échouent souvent en raison du blocage qui se produit lorsque vous essayez de lire et d'écrire le même canal dans le même thread. –

1

Il semble que le client essaie de lire l'accusé de réception avant d'avoir écrit le message.

+0

même si je change l'ordre, le client s'arrête simplement. La réponse est optionnelle ... s'il n'y a pas de réponse, elle continue d'attendre. – wishi

+0

readObject() se bloque jusqu'à la réception des données. Donc, si le serveur ne reconnaît jamais, alors vous attendez pour toujours. Vous dites que l'ACK est optionnel ... peut-être que vous pouvez développer pourquoi vous voulez un ACK si ce n'est pas nécessaire. Combien de temps faut-il attendre avant d'abandonner? Pourquoi cette boucle s'en préoccupe-t-elle? – PSpeed

+0

@wishi_ Je suggère que vous arrêtiez de déplacer les choses au hasard et PENSEZ à ce qui se passe. Comme l'indique @PSpeed, l'appel d'une opération de lecture sur le flux d'entrée du client le bloque jusqu'à ce qu'il reçoive les données (facultatives ou non) du serveur. –

1

de Split le "envoi" et le code "recevoir" dans des threads séparés, le thread d'écriture peut écrire sur le socket pendant que votre autre thread est bloqué sur l'appel à readObject().

Si cela doit être un client de longue durée, je recommande également d'utiliser DataInputStream et DataOutputStream de niveau inférieur à la place de ObjectInputStream/ObjectOutputStream, pour empêcher le stockage d'une IdentityHashmap éventuellement importante des objets.

Questions connexes