この質問に対する満足のいく答えをどこにも見つけることができませんでした。内部事情に詳しい方、教えていただけないでしょうか。
この問題を説明するために、単純なクライアント/サーバーを作成しました。 サーバーは 1 行のテキストを読み取り、ソケットを閉じます。クライアントは 1 行のテキストを書き込み、10 秒待ってから、さらに 2 行のテキストを書き込みます。2 回目の書き込み (10 秒後) は失敗しますが、最初の書き込みは常に成功します。
BufferedWriter が最初の書き込み自体で例外をスローできないのはなぜですか? 結局、ソケットはずっと前に閉じられていました。コードはまた、最初の書き込みの直前にソケットで読み取りを行い、-1 を返して、入力側がソケットのクローズを既に検出したことを示します。なぜ出力側もこれを知ることができないのですか?
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(9000);
Socket s = ss.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println(in.readLine());
s.close();
System.out.println("Socket closed");
}
}
public class Client {
public static void main(String[] args) throws IOException, InterruptedException {
Socket s = new Socket("localhost", 9000);
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
out.write("Hello, World!\n"); out.flush();
Thread.sleep(10000);
System.out.println("Read from socket returns: " + s.getInputStream().read());
out.write("First write\n"); out.flush();
System.out.println("First write succeeded without detecting socket closed");
out.write("Second write\n"); out.flush();
System.out.println("Second write succeeded without detecting socket closed");
}
}