Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

closeされたsocketへの動作について

現在、javaを使用してプログラムを作成しているのですが、closeされたsocketに対しての動作について質問があります。

クライアント側のプログラムに

ObjectOutputStream.writeObject(send);
ObjectOutputStream.flush();
ObjectInputStream.readObject();

というものがあったとします。

サーバ側でsocketをcloseし、上記のプログラムを走らせた場合writeObjectにてsocketExceptionを検出する場合とreadObjectでEOFExceptionを検出する場合の2パターンが起こりうるのですが、これはなぜでしょうか?

また、サーバ側でのsocketのcloseをクライアント側で検知する為には、IOExceptionで上記2つのExceptionをcatchするべきですか?それとも、SocketExceptionとEOFExceptionをそれぞれcatchするべきなんでしょうか?

なお、上記のwriteObjectの引数のsendはSerializeを継承して作成した自作クラスのオブジェクトです。

2

回答

6676

閲覧

2件の回答

評価

0

書いてあるコードは、IOExceptionしか返さないはずだけど。
まずは、SocketExceptionやEOFExceptionが発生しうる箇所を調べましょう

>サーバ側でのsocketのcloseをクライアント側で検知する為には

検知してどうするの?

通信が終わるたびに、ソケットを閉じて、
そのまま黙り込んでしまうようなサーバーなんか、
サーバーの名に値しないよ。

無限ループにして、
通信が終わったら、そのソケットを閉じて、
また新しいソケットを開くようにすれば、
解決するんじゃない?

評価

0

いろいろとウソを書いていたようだ。orz

返す、じゃなくて、投げるだし。

>writeObjectにてsocketExceptionを検出
>readObjectでEOFExceptionを検出

前者はストリームは正常で、ソケットがエラーを投げている、
後者は、ストリームが、もうデータは無いよ、と言っている。

そもそも違うことをやっているのに、
同じエラーじゃないのが、何がおかしいの?

「検知してどうするの?」と書いたのは、
検知したところで、何かしなきゃならないのは、
サーバー側だからです。

IOExceptoinですませるかどうかは、
検知したあと、どうしたいかによる。

でも、サーバーもどきを、
まともなサーバーにすれば、必要ない話でしょ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。