2016-05-02 1 views
-1

J'écris un programme de chat java tout-en-un qui agira comme un client ou un serveur. J'ai actuellement ce problème où, après que la connexion soit établie, le programme reçoit seulement (ou envoie?) Certains des messages. J'ai utilisé une boucle pour spammer à travers une charge d'ordure et j'ai vu que l'autre extrémité ne prendra que quelques messages. Je n'ai jamais reçu de message à envoyer manuellement. Voici le code:L'application de chat Java ne récupère que quelques messages envoyés

public class ConnectionThread implements Runnable { 

private Connection c = Connection.getInstance(); 
private ChatInterface chatInterface; 
private static ConnectionThread serverThread; 
private ServerSocket serverSocket; 
private Socket socket; 
private ObjectInputStream dataIn; 
private ObjectOutputStream dataOut; 

public ConnectionThread() {} 

public static synchronized ConnectionThread getInstance() { 
    if (serverThread == null) { 
     serverThread = new ConnectionThread(); 
    } 
    return serverThread; 
} 

public void run() { 
    // If the programs role is server, set up the server 
    if (c.getRole() == ConnectionRole.SERVER) { 
     try { 
      setupServer(); 
      waitForConnection(); 
      setupStreams(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     do { 
      try { 
       chatInterface.addToChatHistory(dataIn.readUTF()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } while (c.getRole() == ConnectionRole.SERVER); 
    } 
    // If the programs role is client, set up a connection to the server 
    if (c.getRole() == ConnectionRole.CLIENT) { 
     try { 
      setupClient(); 
      setupStreams(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     do { 
      try { 
       chatInterface.addToChatHistory(dataIn.readUTF()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } while (c.getRole() == ConnectionRole.CLIENT); 
    } 
} 

private void setupClient() throws IOException { 
    System.out.println("ATTEMPTING TO CONNECT..."); 
    socket = new Socket("127.0.0.1", 8080); 
    System.out.println("CONNECTED!"); 
} 

private void setupServer() throws IOException { 
    System.out.println("SETTING UP SERVER.."); 
    serverSocket = new ServerSocket(8080, 1); 
    System.out.println("SERVER SETUP"); 
} 

private void waitForConnection() throws IOException { 
    System.out.println("WAITING FOR A CONNECTION..."); 
    socket = serverSocket.accept(); 
    System.out.println("CONNECTION RECIEVED"); 
} 

private void setupStreams() throws IOException { 
    System.out.println("SETTING UP STREAMS..."); 
    dataOut = new ObjectOutputStream(socket.getOutputStream()); 
    dataIn = new ObjectInputStream(socket.getInputStream()); 
    chatInterface = ChatInterface.getInstance(); 
    System.out.println("STREAMS SETUP"); 
} 

public void sendMessage(String message) throws IOException { 
    System.out.println("SENDING MESSAGE..."); 
    dataOut.writeUTF(message); 
    chatInterface.addToChatHistory(message); 
    System.out.println("MESSAGE SENT!"); 
} 
} 

Quelqu'un peut-il me dire pourquoi pas tous les messages sont envoyés/téléchargé correctement? Je joue avec ça depuis un bon moment et je n'arrive pas à comprendre pourquoi.

+0

Où envoyez-vous des messages .... – 3kings

+1

Ce code recevra tout ce que vous envoyez. Si quelque chose n'est pas reçu, vous ne l'avez pas envoyé. Vous devriez arrêter de lire quand 'readUTF()' lance 'EOFException', et vous n'avez pas besoin de' ObjectInput/OutputStreams' pour ceci: 'DataInput/OutputStreams' sont suffisants. – EJP

+0

Les messages sont envoyés en utilisant la méthode sendMessage en bas. Cette méthode est appelée par une autre classe lorsque l'utilisateur clique sur le bouton d'envoi dans l'interface. – user3278983

Répondre

0

J'ai découvert après avoir suivi la recommandation d'EJP de passer à DataInput/OutputStreams qui a fonctionné immédiatement. Bien que je devais utiliser ObjectInput/OutputStreams alors je suis revenu. J'ai trouvé que j'avais encore le même problème, jusqu'à ce que je passe à write/readObject au lieu de write/readUTF. Si je jette le readObject à (String), il parviendra alors à recevoir tous les messages. Donc, si quelqu'un rencontre le même problème avec ObjectInput/OutputStreams en utilisant write/readUTF, essayez d'utiliser write/readObject à la place.