0

ソケットを使用して双方向通信を行うプログラムを作成しています。クライアント プログラムはユーザーにいくつかのオプションを提示します。ユーザーがそのオプションを選択すると、サーバー プログラムによって処理され、結果がクライアント プログラムに返されます。以下に示すように、条件ステートメント内に PrintWriter ステートメントを配置すると、Server Program ステートメントが処理されないため、サーバー プログラムで問題が発生しています。

クライアント:

Socket socket = null;

    try
    {
        System.out.println("Connecting to Server");

        socket = new Socket("192.168.0.104", 7003);
        socket.setSoTimeout(10000);
        System.out.println("Connected");

        DataOutputStream os = new DataOutputStream(socket.getOutputStream());

        InputStreamReader userInput = new InputStreamReader(System.in);
        BufferedReader userBuffer = new BufferedReader(userInput);

        InputStreamReader serverInput = new InputStreamReader(socket.getInputStream());
        BufferedReader serverBuffer = new BufferedReader(serverInput);
        PrintWriter print = new PrintWriter(socket.getOutputStream(), true);

        System.out.println("Option 1");
        System.out.println("Option 2");
        System.out.println("Option 3");
        String userOption = userBuffer.readLine();

        os.writeBytes(userOption);

        if (userOption.equals("1"))
        {
            String line = serverBuffer.readLine();              
            System.out.println(line);               
        }

        System.out.println("Closing Client Connection");
        serverBuffer.close();
        serverInput.close();
        print.close();
        socket.close();
        os.close();
        System.exit(0);

    }

サーバ:

ServerSocket serverSock = null;
    Socket standSock = null;

    try
    {
        serverSock = new ServerSocket(7003);
        standSock = serverSock.accept();

        InputStreamReader input = new InputStreamReader(standSock.getInputStream());
        BufferedReader read = new BufferedReader(input);
        PrintWriter print = new PrintWriter(standSock.getOutputStream(), false);

        String dateTime = (Calendar.getInstance()).getTime().toString();

    if (read.readLine().equals("1"))
    {
        System.out.println("Option 1");
        print.println("You're connected to the Server at: " + dateTime);
    }

        System.out.println("Closing Server Connection");
        read.close();
        input.close();
        print.close();
        standSock.close();

    }

クライアントプログラムからのユーザー入力とそれが正しく取得されることをテストしましたが、問題は移動した場合です

print.println("You're connected to the Server at: " + dateTime);

条件ステートメント内でプログラムがハングし、最終的にタイムアウトしますが、そのステートメントを条件ステートメントの外に移動すると機能します。条件ステートメント内に配置すると機能しないのはなぜですか?

4

2 に答える 2

2

os.writeBytes(userOption);イン クライアントが実際にリターンを書き込むことはありません。サーバー上で readline() を呼び出しているため、リターンを入力するまで待機します。System.in から呼び出している readline() は、入力した戻り値を実際に破棄するため、送信されません。に追加+ \n"するos.writeBytes(userOption);とうまくいくはずです。

おそらくより良いオプションは、クライアントで作成している PrintWriter を実際に使用することです。これにより、 を呼び出した後に StreamBuffer が自動的にフラッシュされますprint.println(userOption)。そしてそれは余分なものを必要としません\n

于 2012-09-06T21:17:59.597 に答える
1

問題は、DataOutputStream が実際に情報を送信するのは、改行の後またはストリームを閉じたときだけですが、ストリームを閉じるとソケットも閉じられることです。

特にコンストラクターで2番目の引数をtrueにして「自動フラッシュ」できる場合、そのPrintWriterオブジェクトでprintln()を実行すると、自動的に情報。

于 2012-09-06T22:17:49.040 に答える