2

割り当て用のクライアントとタイム サーバーを作成しようとしていますが、サーバーがクライアントからの 2 番目の要求を受信するのに問題があります。最初のリクエストは問題なく通過します。その後、失速するだけです。私は実際にはこの全体でかなり迷っていて、まだ 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());
           }
      }

 }
4

2 に答える 2

4

次のような別の 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();
          }
      }
 }
于 2009-11-30T03:37:42.607 に答える
3

PrintWriter ドキュメントから:

...自動フラッシュが有効になっている場合は、、、、またはメソッドのいずれかが呼び出されたときにのみ実行さprintlnprintfますformat

サーバーが呼び出しprint()を行っており、ストリームをフラッシュすることはないため、時間が送信されることはありません。ストリームを呼び出すprintln()か、明示的にフラッシュします。

また、サーバーは時刻を送信した直後に接続を閉じるため、クライアントの2番目の要求は常に失敗します...

編集:ここには興味深い癖があります-PrintWriter それをフラッシュする必要があります(の仕様を参照Writer)が、操作の順序のために、代わりに発生するように見えるのは次のとおりです:

  1. in.close()基になるを閉じますSocket
  2. out.close() 書き込まれたデータをフラッシュしますが、フラッシュできません(ソケットが閉じられているため)

これが正確に起こっていることかどうかはわかりませんが、これら2つのステートメントの順序を入れ替えると、動作が変わり、おそらくout.close()フラッシュする機会が与えられます...

于 2009-11-30T02:04:04.437 に答える