Java сервер-клиент | сервер не получит второй запрос - PullRequest
2 голосов
/ 30 ноября 2009

Я пытаюсь написать клиент и сервер времени для назначения, и у меня возникают проблемы с получением сервером второго запроса от клиента. Первый запрос проходит нормально без заминки. тогда это просто глохнет. Я на самом деле довольно потерян во всем этом и довольно неудобен с Java, поэтому я понятия не имею, что мне не хватает Любые указатели очень ценятся. Спасибо!

Вот код сервера:

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

}

Вот клиент:

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

 }

Ответы [ 2 ]

4 голосов
/ 30 ноября 2009

Вам нужен еще один цикл while, что-то вроде этого,

  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();
          }
      }
 }
3 голосов
/ 30 ноября 2009

Из PrintWriter документов :

... если включена автоматическая очистка, это будет сделано только при вызове одного из методов println, printf или format ...

Ваш сервер вызывает print() и никогда не сбрасывает поток, поэтому время никогда не отправляется. Либо вызовите println(), либо явно очистите поток.

Кроме того, сервер закрывает соединение сразу после отправки времени, поэтому второй запрос клиента всегда завершается неудачей ...

Редактировать: здесь есть интересная особенность - закрытие PrintWriter должно , чтобы очистить его (см. Спецификации Writer), но из-за в порядке операций то, что кажется происходящим вместо этого:

  1. in.close() закрывает базовый Socket
  2. out.close() будет сбрасывать записанные данные, но не может (поскольку сокет теперь закрыт) * ​​1039 *

Не уверен, что это именно то, что происходит, но изменение порядка этих двух операторов меняет поведение, по-видимому, давая out.close() шанс сбросить ...

...