私の問題は簡単です。シンプルなチャットをしようとしていますが、サーバーから切断されたクライアントの検出が必須だと感じています。シンプルを使用すると、チャットは正常に機能します(そのような検出なし):
if (this.in.ready()) //preinitialized buffered reader
this.dataIn=this.in.readLine();
ここに投稿された多くのWebサイト/質問を閲覧しましたが、ready()
すべてをブロックするため、省略すべきであると読みましたready()
.
私の目標を達成するために、BufferedReader
ヌルを受信するかどうかをテストする必要がありますreadLine()
が、これも正常に機能しません。
if (this.in.readLine()!=null){ //1. check if client disconnected
if (this.in.ready()) //2/
this.dataIn=this.in.readLine(); //3.
}
else
this.notice="Client disconnected!";
上記のコードを適用するとどうなりますか。初期の場合 (1) は、ready()
ソケット (3) を介して送信される実際のメッセージを読み取るために必要な内部 (2 行目) をブロックしています。
他の「注文」は機能しません。
if (this.in.ready()){
this.dataIn=this.in.readLine();
}
else if (this.in.readLine()!=null)
this.notice="Client disconnected!";
これも、ソケットを介してメッセージを送信することを許可しません。
※はい、送受信は別スレッドで実現
*BufferedReader は一度だけ初期化されます
スレッドのソース コード (見るために必要な場合):
@Override
public void run() {
try {
if (this.isServer){
this.initServer();
this.initProcessData(sSocket);
}
else if (!this.isServer){
this.initClient();
this.initProcessData(clientSocket);
}
this.initDone=true;
} catch (IOException ex) {
Logger.getLogger(NetClass.class.getName()).log(Level.SEVERE, null, ex);
}
while(this.initDone){
try {
Thread.sleep(100);
if ((!this.dataOut.isEmpty())&&(this.dataOut!="")){
this.out.println(this.dataOut);
this.out.flush();
this.dataOut = "";
}
if (this.in.ready())
this.dataIn=this.in.readLine();
}
catch (IOException ex) {
Logger.getLogger(NetClass.class.getName()).log(Level.SEVERE, null, ex);
}
catch (InterruptedException ex) {
this.initDone=false;
Logger.getLogger(NetClass.class.getName()).log(Level.SEVERE, null, ex);
}
//System.out.println(this.notice);
}
}
最悪のことは、クライアントの切断が適切に検出されているか、チャットが機能していることです。
これら2つを組み合わせるにはどうすればよいか教えてもらえますか? どんな助けでも大歓迎です。