0

読み取りタイムアウトを使用して、サーバー側でのユーザー切断検出を克服しようとしています。これは私のコードの一部です:

try {
        socket.setSoTimeout(3000);
        in = new DataInputStream(socket.getInputStream());
        out = new DataOutputStream(socket.getOutputStream());
        usr = new User(in.readUTF());
        usr.connectUser();
        int i=0;
        while(true){
            try{
                i = in.readInt();
            }
            catch(SocketTimeoutException e){
                System.Out.Println("Timeout");
                // user connected, no data received
            }
            catch(EOFException e){
                System.Out.Println("Disconnected");
                // user disconnected
            }
        }
    }
    catch(Exception  e){
        // other exceptions
    }

「ユーザーが切断された」問題を除いて、コードは正常に機能します。タイムアウト例外をキャッチし、データを待ち続けたいのですが、クライアントがまだ接続している場合に限ります。SocketTimeoutException 以外の例外が発生しないのはなぜですか? クライアントが切断されたために in.readInt() がソケットを使用できないときに IOException を取得すべきではありませんか?

ユーザーの切断を検出する他の簡単な方法はありますか? ユーザーが突然wifiをシャットダウンしたなど、不要な切断を意味します...

ありがとう、リオズ。

4

1 に答える 1

0

クライアントがタイムアウト期間内に何も書き込まなかった場合、SocketTimeoutException が発生します。彼が何かを書き込む代わりに切断した場合、EOFException が発生します。それらを別々にキャッチします。あなたが EOFException を取得しなかった場合、彼は切断していません。

于 2012-11-03T21:54:14.750 に答える