문제

할당을 위해 클라이언트와 시간 서버를 작성하려고 노력하고 있으며 서버가 클라이언트로부터 두 번째 요청을 받도록하는 데 어려움이 있습니다. 첫 번째 요청은 장애없이 잘 통과됩니다. 그런 다음 마구간입니다. 나는 실제로이 모든 일에서 꽤 길을 잃었고 여전히 Java가 여전히 불편하기 때문에 내가 무엇을 놓치고 있는지 전혀 모른다. 모든 포인터는 크게 감사합니다. 감사!

다음은 Sever 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));
      }

}

고객은 다음과 같습니다.

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

 }
도움이 되었습니까?

해결책

당신은 또 다른 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();
          }
      }
 }

다른 팁

로부터 PrintWriter 문서:

... 자동 플러싱이 활성화되면 하나의 경우에만 수행됩니다. println, printf, 또는 format 방법이 호출됩니다 ...

서버가 호출 중입니다 print() 그리고 스트림을 플러시하지 않으므로 시간은 절대 보내지 않습니다. 어느 쪽이든 전화 println() 또는 스트림을 명시 적으로 플러시합니다.

또한 서버는 시간을 보내 자마자 연결을 닫으므로 클라이언트의 두 번째 요청은 항상 실패합니다 ...

편집하다: 여기에 흥미로운 기발함이 있습니다 PrintWriter 플러시하려면 (사양을 참조하십시오 Writer), 그러나 운영 순서로 인해 보인다 대신 일어나는 것은 다음과 같습니다.

  1. in.close() 기본을 닫습니다 Socket
  2. out.close() ~일 것이다 작성된 데이터를 플러시하지만 (소켓이 닫히기 때문에)

이것이 정확히 무슨 일이 일어나고 있는지 확실하지 않지만이 두 진술의 순서를 바꾸면 행동이 바뀌면서 out.close() 플러시 할 기회 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top