0

私の問題は簡単です。シンプルなチャットをしようとしていますが、サーバーから切断されたクライアントの検出が必須だと感じています。シンプルを使用すると、チャットは正常に機能します(そのような検出なし):

                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つを組み合わせるにはどうすればよいか教えてもらえますか? どんな助けでも大歓迎です。

4

1 に答える 1

0

java.io.ObjectInputStreamと の使用を検討してくださいjava.io.ObjectOutputStream。別のワーカー スレッドでブロッキングread()メソッドを使用し、-1 を返すか例外をスローするまでループします。String オブジェクトを送受信します。このように、改行付きのメッセージを送ることもできます。

于 2012-01-31T21:34:38.520 に答える