2

私はマルチスレッド チャット サーバー/クライアントを作成しています。SocketTest V 3 を使用してサーバーをテストしましたが、正常に動作しているように見えますが、クライアントは、新しい行を作成するときにコンソールで更新のみを作成しました。ソケットテストに対してクライアントを所有し、何かが書き込まれるたびにソケットが更新されますが、クライアントは更新されません

public class clientV2 {


public static final int PORT = 5019;
public static InetAddress host;

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

    try {
        host = InetAddress.getLocalHost();
        Socket socket = new Socket(host, PORT);

        Scanner in = new Scanner(System.in);

        Scanner inputFromServer = new Scanner(socket.getInputStream());

        PrintWriter outputToServer = new PrintWriter(socket.getOutputStream());

        while(true) {
            if(inputFromServer.hasNext()) {
                System.out.println(inputFromServer.nextLine());
            }

            String input = in.nextLine();
            outputToServer.println(input);
            outputToServer.flush();

        }

    } catch (Exception e) {

    }
}

}

4

2 に答える 2

1

クライアントがnextLine()スキャナを呼び出すと、その名前が示すように、このメソッドは次の行を返します。したがって、次の行が完全に利用可能になるまで、クライアントは何も印刷できません。

javadoc の内容は次のとおりですnextLine()

このスキャナを現在の行を超えて進め、スキップされた入力を返します。このメソッドは、最後の行セパレーターを除いて、現在の行の残りを返します。位置は次の行の先頭に設定されます。

このメソッドは引き続き入力を検索して行区切りを探すため、行区切りが存在しない場合は、スキップする行を検索するすべての入力をバッファリングする可能性があります。

于 2012-10-21T15:07:02.823 に答える
0

これはSystem.out.println(inputFromServer.nextLine());まさにそれを行うためです。行全体を待ってから、それを出力します。部分的な行は印刷されません。

出力が最後の部分的な行 (改行から改行まで。改行はカウントされません) 以外にも欠落している場合は、途中でバッファーを探します。

を使用しInputStreamReaderて、入力ストリーム (バイト ストリーム) から 1 文字を読み取ることができます。コンストラクタで文字セットを指定できます。

InputStreamReader inputFromServer = 
  new InputStreamReader(socket.getInputStream(), "UTF-8");

System.out.print((char) inputFromServer.read());
于 2012-10-21T15:08:06.563 に答える