Frage

Ich versuche, einen Client und Zeitserver für eine Zuordnung zu schreiben, und ich habe Probleme bekommen den Server die zweite Anforderung von dem Client zu empfangen. Die erste Anfrage geht ohne Probleme durch fein. stirbt er dann einfach. Ich bin eigentlich ziemlich in dieser ganzen Sache und ziemlich unbequem mit Java immer noch verloren, so habe ich keine Ahnung, was ich fehle. Alle Hinweise werden sehr geschätzt. Dank!

Hier ist der Server-Code:

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

}

Hier ist der Kunde:

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

 }
War es hilfreich?

Lösung

Sie müssen eine andere while-Schleife haben, so etwas wie dies,

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

Andere Tipps

Von der PrintWriter docs :

  

... wenn automatische Spülung aktiviert ist, wird es nur dann erfolgen, wenn eine der println, printf oder format Methoden aufgerufen wird ...

Ihr Server ist print() Aufruf und nie den Strom spült, so wird nie die Zeit geschickt. Entweder rufen println() oder explizit den Strom spülen.

Auch schließt der Server die Verbindung unmittelbar nach dem Zeitpunkt zu senden, so dass der zweite Anforderung des Kunden immer versagt ...

Edit: gibt es eine interessante Marotte hier - Schließen der PrintWriter sollte es spülen (siehe die Spezifikation von Writer ), aber aufgrund der Reihenfolge der Operationen, was em < > scheint stattdessen geschehen ist:

  1. in.close() schließt die darunter liegende Socket
  2. out.close() würde spült die Daten geschrieben, kann aber nicht (wie der Sockel ist jetzt geschlossen)

Nicht sicher, das ist genau das, was passiert ist, aber die Reihenfolge dieser beiden Aussagen Swapping das Verhalten ändert, vermutlich out.close() gibt eine Chance zu spülen ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top