Question

J'essaie d'écrire un client et un serveur de temps pour une affectation et je ne parviens pas à faire en sorte que le serveur reçoive la deuxième demande du client. La première demande passe sans problème. alors il se bloque. En fait, je suis assez perdu dans cette affaire et assez mal à l'aise avec Java encore, alors je n'ai aucune idée de ce qui me manque. Tous les indicateurs sont grandement appréciés. Merci!

Voici le code de serveur:

 import java.io.*;
 import java.util.*;
 import java.net.*;
 import java.text.*;

 public class myServer {

      protected static final int PORT_NUMBER = 55555;

      public static void main( String args[]) {

      try {

           ServerSocket servsock = new ServerSocket(PORT_NUMBER);

           System.out.println("Server running...");

           while(true) {

                Socket sock = servsock.accept();

                System.out.println("Connection from: " + sock.getInetAddress());

                Scanner in = new Scanner(sock.getInputStream());
                PrintWriter out = new PrintWriter(sock.getOutputStream());
                String request = "";

                request = in.next();

                System.out.println("Request: " + request);

                if(request.toUpperCase().equals("TIME")) {
                     out.println(getTime());
                     out.flush();
                } else {
                     out.println("Invalid Request...");
                     out.flush();
                }

            }

        } catch(Exception e) {
           System.out.println(e.toString());
        }

    }

      protected static String getTime() {
           DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
           Date date = new Date();
           return (dateFormat.format(date));
      }

}

Voici le client:

 import java.io.*;
 import java.util.*;
 import java.net.*;

 public class myClient {

        protected static final String HOST = "127.0.0.1";
        protected static final int PORT = 55555;

        protected static Socket sock;

        public static void main(String args[]) {

        try {

              sock = new Socket(HOST,PORT);

              System.out.println("Connected to " + HOST + " on port " + PORT);

              Scanner response = new Scanner(sock.getInputStream());
              PrintWriter request = new PrintWriter(sock.getOutputStream());
              BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
              String txt = "";

              while(!txt.toUpperCase().equals("EXIT")) {

                    System.out.print("prompt:");
                    txt = in.readLine();

                    request.println(txt);
                    request.flush();

                    System.out.println(response.next());

              }

              request.close();
              response.close();
              in.close();
              sock.close();

           } catch(IOException e) {
              System.out.println(e.toString());
           }
      }

 }
Était-ce utile?

La solution

Vous devez avoir une autre boucle while, quelque chose comme ceci,

  while(true) {                
      Socket sock = servsock.accept();                
      System.out.println("Connection from: " + sock.getInetAddress());                
      Scanner in = new Scanner(sock.getInputStream());                
      PrintWriter out = new PrintWriter(sock.getOutputStream());                
      String request = "";                
      while (in.hasNext()) {
          request = in.next();                
          System.out.println("Request: " + request);                
          if(request.toUpperCase().equals("TIME")) {                     
              out.println(getTime());
              out.flush();                
          } else {
               out.println("Invalid Request...");                     
               out.flush();
          }
      }
 }

Autres conseils

À partir de PrintWriter docs :

  

... si le vidage automatique est activé, cela ne sera fait que si l'une des méthodes println , printf ou format est invoquée ...

Votre serveur appelle print () et ne vide jamais le flux, de sorte que l'heure ne soit jamais envoyée. Appelez println () ou purgez explicitement le flux.

De plus, le serveur ferme la connexion immédiatement après l'envoi de l'heure, de sorte que la deuxième requête du client échoue toujours ...

Modifier: il y a là une bizarrerie intéressante: la fermeture du PrintWriter doit le vider (voir la spécification de Writer a>), mais en raison de l'ordre des opérations, ce qui semble se produire est plutôt:

  1. in.close () ferme le socket sous-jacent
  2. out.close () effacerait les données écrites, mais ne peut pas (car le socket est maintenant fermé)

Je ne suis pas sûr que ce soit exactement ce qui se passe, mais inverser l'ordre de ces deux instructions modifie le comportement, donnant probablement à out.close () la possibilité de vider ...

scroll top