読み取りタイムアウトを使用して、サーバー側でのユーザー切断検出を克服しようとしています。これは私のコードの一部です:
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をシャットダウンしたなど、不要な切断を意味します...
ありがとう、リオズ。