2011-02-10 4 views
0

Je crée un programme multi-client/serveur standard en Java. Le serveur accepte les connexions et génère un nouveau thread pour gérer chacun d'eux. Le client génère également un thread pour attendre les messages du serveur. Le client et le serveur communiquent en passant des objets Message via ObjectInputStream et ObjectOutputStreams.Problème client/serveur Java envoyant des objets sur des sockets

La poignée de main initiale fonctionne correctement. Lorsque le client démarre, il ouvre une connexion socket au serveur. Le serveur accepte le socket, envoie un message au client indiquant que la connexion a réussi. Ensuite, le client renvoie son nom d'utilisateur et le client et le serveur commencent à attendre les messages. Ensuite, j'envoie du texte à mon client qui crée un message de discussion, et l'envoie avec succès au serveur. Le serveur reçoit ce message et tente de l'envoyer à tous les clients connectés, ce qu'il fait (il n'y en a qu'un). Le problème est que ce message ne revient jamais au client.

// This is Message.send 
public void send(ObjectOutputStream stream) throws IOException{ 
     stream.writeObject(this); 
} 

// ClientThread.run 
public void run(){ 
    try { 
     out = client.getOutputStream(); 
     out.flush(); 
     ObjectInputStream in = client.getInputStream(); 

     Message msg = null; 
     int len; 
     byte[] bytes = null; 
     int i = 0; 

     // Continuously read new Messages from the server 
     while(true){ 
      msg = (Message)in.readObject(); 

      processInput(msg); 
     } 
    } catch (Exception e) { 
     Util.showError(e.getMessage(), "Connection Error"); 
    } 

    System.out.println("Client exited"); 
} 

// ServerThread.run 
public void run() { 
    try { 
     out = new ObjectOutputStream(client.getOutputStream()); 

     ObjectInputStream in = new ObjectInputStream(client.getInputStream()); 

     Message msg = null; 

     while(client.isConnected()){ 
      msg = (Message)in.readObject(); 
      processInput(msg); 
     } 

     in.close(); 
     client.close(); 
    } catch (Exception e) { 
     server.addMessage(e.getMessage()); 
    } 
} 
+0

Um, envisagez-vous d'utiliser SOAP ou REST plutôt que de vous embêter? – bmargulies

+0

C'est un exercice donc je peux m'entraîner avec des sockets à un niveau inférieur sans utiliser un protocole existant. – Jared

Répondre

0

Je ne vois pas d'appels à flush(), sans que les données ne peuvent jamais rendre du point a au point b.

Je vous recommande d'utiliser l'ObjectOutputStream sur un ByteArrayOutputStream et de pousser le tableau d'octets résultant sur le réseau, puis d'inverser le processus à l'autre extrémité.

+0

J'ai ajouté un flush() après l'appel writeObject dans send(), et un après l'instanciation de chacun des ObjectOutputStreams. Pas de chance cependant. – Jared