1

ネットワークソケットの読み取りと書き込みを行うスレッドを取得しました。

public void run() {
    try {
        Socket socket = new Socket("10.0.1.11", 19456);
        out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String message = "13" + seperator + "0" + seperator + "userdata";
        out.write(message);
        out.flush();

        while (listen) {
            String input = "";

            for (int letter = in.read(); letter != -1; letter = in.read()) {
                System.out.println((char)letter);
                input += (char)letter;
            }

            System.out.println(input);
            displayText(input);
        }

        socket.close();
    } catch (UnknownHostException e) {
        displayText("Could not connect to server!");
    } catch (IOException e) {
        displayText("Could not open IO to server!");
    }
}

ただし、forループ以降のすべてが実行されるわけではありません。forループ内のSystem.out.printlnは、想定されているすべての文字を出力しますが、forループ後のSystem.out.printlnおよびdisplayText関数は実行されません(ブレークポイントでチェックされます)...何が欠けていますかここ?:S

4

2 に答える 2

3

http://www.docjar.com/docs/api/java/io/Reader.html#readによると

This method will block until a character is available,
an I/O error occurs, or the end of the stream is reached.

それらのコード例は、EOFで-1が返されることを示しています。

したがって、 in.read()がEOF条件を認識していないため、forループがブロックされています。

そして、ソケットサーバーが送信方向をシャットダウンし、クライアントで受信側の半分を閉じるまで、それを行うことはできません。

于 2012-06-17T14:04:21.823 に答える
0
  1. デバッガーでプログラムを開始する
  2. バグを再現
  3. スレッドがまだ存在するかどうかを確認します (Eclipse では、デバッグ ビューにすべてのプロセスとそのスレッドが一覧表示されます)。
    • スレッドが存在する場合: 一時停止します (Eclipse では、スレッドをクリックして一時停止アイコンを押します)。デバッガーはそのスレッドのスタックを表示するようになったので、そのスレッドが何をしていたかを調べることができます。
    • スレッドがもう存在しない場合は、正常に終了するか、(未処理の例外が原因で) 突然終了する必要があります。これは、run() の最後のステートメントにブレーク ポイントを設定することで区別できます。突然完了した場合は、スレッドのキャッチされていない例外ハンドラーが呼び出されている必要があります。
于 2012-06-17T14:23:26.603 に答える