Pregunta

Estoy tratando de escribir un cliente y un servidor horario para una tarea y tengo problemas para que el servidor reciba la segunda solicitud del cliente. La primera solicitud pasa bien sin problemas. entonces solo se detiene. De hecho, estoy bastante perdido en todo esto y bastante incómodo con Java, así que no tengo idea de lo que me estoy perdiendo. Cualquier puntero es muy apreciado. Gracias!

Aquí está el código del servidor:

 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));
      }

}

Aquí está el cliente:

 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());
           }
      }

 }
¿Fue útil?

Solución

Necesitas tener otro ciclo while, algo como esto,

  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();
          }
      }
 }

Otros consejos

Desde PrintWriter documentos :

  

... si el lavado automático está habilitado, se realizará solo cuando se invoque uno de los métodos println , printf o format ...

Su servidor está llamando a print () y nunca vacía la transmisión, por lo que el tiempo nunca se envía. Llame a println () o vacíe explícitamente la secuencia.

Además, el servidor cierra la conexión inmediatamente después de enviar la hora, por lo que la segunda solicitud del cliente siempre falla ...

Editar: hay una peculiaridad interesante aquí: cerrar el PrintWriter ought para vaciarlo (consulte las especificaciones de Writer ), pero debido al orden de las operaciones, lo que parece suceder es:

  1. in.close () cierra el Socket
  2. subyacente
  3. out.close () eliminaría los datos escritos, pero no puede (ya que el socket está cerrado)

No estoy seguro de que esto sea exactamente lo que está sucediendo, pero cambiar el orden de estas dos declaraciones cambia el comportamiento, presumiblemente dando a out.close () la oportunidad de eliminar ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top