Domanda

Sto provando a scrivere un client e un time server per un compito e sto riscontrando problemi nel far sì che il server riceva la seconda richiesta dal client. La prima richiesta va bene senza intoppi. poi si blocca. In realtà sono piuttosto perso in tutto questo e piuttosto a disagio con Java ancora, quindi non ho idea di cosa mi manchi. Tutti i suggerimenti sono molto apprezzati. Grazie!

Ecco il codice sever:

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

}

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

 }
È stato utile?

Soluzione

Devi avere un altro ciclo while, qualcosa del genere,

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

Altri suggerimenti

Dal PrintWriter docs :

  

... se il lavaggio automatico è abilitato, verrà eseguito solo quando viene invocato uno dei metodi println , printf o format ...

Il tuo server chiama print () e non scarica mai lo stream, quindi l'ora non viene mai inviata. Chiama println () o svuota esplicitamente il flusso.

Inoltre, il server chiude la connessione immediatamente dopo l'invio dell'ora, quindi la seconda richiesta del client fallisce sempre ...

Modifica: c'è una stranezza interessante qui: la chiusura di PrintWriter dovrebbe per svuotarlo (vedi le specifiche di Writer ), ma a causa dell'ordine delle operazioni ciò che sembra invece accade:

  1. in.close () chiude il Socket
  2. sottostante
  3. out.close () vorrebbe svuotare i dati scritti, ma non può (poiché il socket è ora chiuso)

Non sono sicuro che questo sia esattamente ciò che sta accadendo, ma lo scambio dell'ordine di queste due istruzioni modifica il comportamento, presumibilmente dando a out.close () la possibilità di svuotare ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top