0

メソッドreadline()(bufferedReaderから)を実際に何かを読み取るまでブロックする方法はありますか?

私はクライアント/サーバーアプリケーションsocketBasedを作成しています、そして私はこれを持っています

サーバーは読み取りと書き込みを行います。クライアントは書き込みを行ってから読み取ります。これはクライアント/サーバー間の通信です(ソケットに基づく)

唯一の問題は、サーバー上で、ブロッキングメソッドではないbufferedReader.readLine()を使用して読み取っているということです。bufferedReader.readLine()をdataInputstream()。read()に置き換えようとしました(すべてのバイトを処理し、-1が受信されたときに取得します)が、どちらも機能しません。

このすべての問題は、サーバーが読み取りを期待しているが、ブロックしないことです。クライアントは、ユーザーがボタンを押したときにのみ(ソケットを介して)サーバーに書き込みます(したがって、サーバーは読み取りを待機している必要がありますが、そうではありません)

サーバー側で私はこれを持っています:

    BufferedReader READ = new BufferedReader(new InputStreamReader(skt.getInputStream()));
        BufferedWriter WRITE = new BufferedWriter(new OutputStreamWriter(skt.getOutputStream()));
        FileInputStream fstream = new FileInputStream(file);
        DataInputStream in = new DataInputStream(fstream);

        boolean FLAG = true;

        String s = new String("#$");

        while (FLAG) {


            if (skt == null)
                FLAG = false;

            // READING FROM THE CLIENT
            while (!READ.ready()){System.out.println("Blocking")};

            while ((s = READ.readLine()) != null) {
                System.out.println("RECEIVING: " + s);
                System.out.println("$$$");
            }

            System.out.print("hi");
            // READING FROM THE FILE AND SENDING TO THE CLIENT
            //WRITTING TO THE CLIENT
            while ((strLine = in.readLine()) != null) {
                System.out.println("SENDING: " + strLine);
                strLine += "\n";
                WRITE.write(strLine);
                WRITE.flush();
                strLine = new String();
            }
        }

クライアント側で私はこれを持っています:

    //READING FROM THE FILE AND SENDING TO THE SERVER
                 while((strLine  = in.readLine()) != null)  
                 {  

                        strLine += "\n";


                        soma+=strLine.length();
                        WRITE.write(strLine);
                        WRITE.flush();

                        TextArea1.append(strLine);
                        ProgressBar.setValue(soma);
                        ProgressBar.repaint();  

                    };          
                    in.close();


                    ProgressBar.setValue(0);
                    soma=0;

                    //READING FROM THE SERVER
                    while((strLine=READ.readLine()) != null)
                    {

                        strLine+="\n";
                        soma+=strLine.length();

                        TextArea2.append(strLine);
                        strLine = new String();
                        ProgressBar.setValue(soma);
                        ProgressBar.repaint();  
                    }

                    in.close();
                    fstream.close();
                    WRITE.close();
                    READ.close();

                    Skt.close();

注: Sktは、クライアントをサーバーに接続するソケットです。

ここでの問題はそれです。クライアントがサーバーに接続するとき、サーバーは接続が確立された直後にソケットから読み取ることを期待します。ただし、クライアント上のコード(サーバーへの書き込み)は、ユーザーがボタンを押したときにのみ実行されることが期待されます。 、クライアントが実際にソケットに書き込みを行わない(サーバーがブロックしていない)まで、サーバーをブロックする必要があります。:-/今回は自分のことをもっとはっきりさせたいと思っています。ごめんなさい

4

2 に答える 2

2

BufferedReader.readLine()は、が見つかるまで常にブロックします'\n'

送信しているデータの例を挙げていただければ、さらにサポートさせていただく場合があります。

于 2012-10-25T16:38:31.750 に答える
-1

次のようなファイルロックアプローチを使用してみてください。

file = new RandomAccessFile("file.txt", "rw");
FileChannel channel = file.getChannel();
fl = channel.tryLock();
// file now is locked
fl.release();
于 2012-10-25T16:39:26.360 に答える