--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/01/14

new PrintWriter(hoge, true);

サーバ・クライアントプログラムを書いてた時の事。

以下のようなコードで、間違いに気づくのに2時間かかった。

Socket socket = new Socket(host, Server.PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(msg);
System.out.println(in.readLine());

だいぶ端折ったけど、要は

  1. PrintWriter でリクエストを送信する
  2. BufferedReader でレスポンスを読み込む
  3. 標準出力に出力する

というクライアントプログラムである。

PrintWriter を使ったのは、明示的に flush する必要がないと勘違いしていたから。今思えば、なぜこのような勘違いをしていたのか。

PrintWriter のコンストラクタには autoFlush というオプションを渡すことができる。そのことを知らなくて、flush してないせいで処理が進まないということに気づかず、2時間悩んだ。正しくは以下。

Socket socket = new Socket(Server.PORT);
// 第二引数が autoflush フラグ
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(msg);
// autoFlush = true してない場合もここで
// out.flush();
// すればいい
System.out.println(in.readLine());
  • 思ったように進まないときには、とりあえず javadoc
スポンサーサイト

comment

post




上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。