1

それで、私は大学のミニプロジェクトのためにこのクライアントサーバープログラムをJavaで実行しました。これは、私が取り組んでいる大きなプロジェクトのほんの小さなモジュールであることに注意してください。クライアントからサーバーに送信する文字列が必要です。サーバーは、クライアントに戻るときに文字列を返します。(コードは、文字列が返送される前に処理されるように後で変更されます)。クライアントは、必要なときにいつでもサーバーに文字列を送信します。したがって、サーバーを無期限に実行することが義務付けられていることを意味します。

ここで私が直面している問題は、クライアントが文字列を送信したときに初めてサーバーが完全に機能することです。別の文字列を使用してクライアントを2回実行すると、以前にサーバーに送信したのと同じ文字列が返されます。

これが私のサーバープログラムです:

        public class Server {

        public static boolean x = true;
        public static String reply;

        public static void main(String a[]) throws Exception {

        System.out.println("Entered server console..");
            Socket echoSocket = null;
            ServerSocket serverSocket = null;
            PrintWriter out = null;
            BufferedReader in = null;

            System.out.println("Initializing Connection..");

            boolean runFlag = true;
            try {
                serverSocket = new ServerSocket(77);

                while (runFlag) {
                    echoSocket = serverSocket.accept();

                    out = new PrintWriter(echoSocket.getOutputStream(), true);

                    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

                    while (x) {

                        in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
                        reply = in.readLine();
                        if (reply != null) {
                            x = false;
                        }
                    }
                    System.out.println("received: " + reply);

                    out.println(reply);

                    System.out.println("sent back: " + reply);
                    stdIn.close();
                }

            } catch (Exception e) {
                System.out.println("Exception in starting server: " + e.getMessage());
            } finally {
                out.close();
                in.close();
                echoSocket.close();
            }

        }
    }

これが私のクライアントプログラムです:

    public class Client {
    public static String reply,temp;
    public static boolean x=true;

    public Client()
    {
        temp="lala";
    }
    public Client(String t)
    {
        temp=t;
    }

    public static void main(String[] args) throws IOException {

        Socket echoSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            echoSocket = new Socket("localhost", 77);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: localhost.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: localhost.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

        temp="lala"; //this is the string to be sent

        out.println(temp);

        while (x) {
            reply= in.readLine();
            if(reply!=null)
            {
                x=false;
            }
        }

        System.out.println("reply: "+reply);

        out.close();
        in.close();
        stdIn.close();
        echoSocket.close();
    }
}

誰かが私がここで問題が何であるかを見つけるのを手伝ってもらえますか?

4

2 に答える 2

4
while (x) {
   in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
   reply = in.readLine();
   if (reply != null) {
      x = false;
   }
}

サーバーは、クライアントが最初に接続したときにこのループに入り、応答文字列をクライアントからの入力に設定します。ただし、xの値がtrueに戻ることはないため、このループに再び入ることはありません。

于 2013-03-27T06:45:37.563 に答える
1

リクエストを受け入れると、xはfalseに設定され、trueになることはありません。ループに入るときはxを初期化してください。さらに、クライアントとサーバーの間にソケットを使用する場合は、

echoSocket = serverSocket.accept();

最初のループから抜け出します。echoSocketを使用して通信できます。その後、長い接続を維持します。

于 2013-04-02T12:48:28.450 に答える