Метод BufferedReader.readLine() Блокираща алтернатива

Има ли някакъв начин методът 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 е сокет, свързващ клиент със сървър.

проблемът тук е, че. Когато клиентът се свърже със сървъра, сървърът очаква да чете от сокета веднага след установяването на връзката.. обаче кодът на клиента (пишещ на сървъра) се очаква да се изпълнява само когато потребителят натисне бутон.. Така че , сървърът трябва да бъде блокиран, докато клиентът действително не напише нещо в сокета, което не е (сървърът не блокира). :-/ Надявам се да се изразя по-ясно този път.. Съжалявам


person Pedro Neves    schedule 25.10.2012    source източник
comment
коригирах форматирането ти ;)   -  person Atmocreations    schedule 25.10.2012
comment
Това, което искате, е точно това, което прави. Това е блокиращ метод. Не е истински въпрос. Предлагам ви да публикувате своя проблем,, а не какво погрешно смятате за решение.   -  person user207421    schedule 26.10.2012


Отговори (2)


BufferedReader.readLine() винаги блокира, докато не намери '\n'.

Ако можете да дадете примери за данни, които изпращате, може да ви помогна допълнително.

person Atmocreations    schedule 25.10.2012
comment
добре, аз изпращам думи (от файл с речник) през сокета.. Вече опитах друг формат и не знам защо не блокира. Ако искате, мога да сложа малко съдържание на файла.. (това беше просто обикновен речник, използван, защото просто искам да изпратя няколко байта по мрежата). - person Pedro Neves; 25.10.2012
comment
@PedroNeves Той блокира. Може би игнорирате края на потока? - person user207421; 23.01.2020

Опитайте се да използвате подход за заключване на файлове като:

file = new RandomAccessFile("file.txt", "rw");
FileChannel channel = file.getChannel();
fl = channel.tryLock();
// file now is locked
fl.release();
person Konstantin Zaitsev    schedule 25.10.2012
comment
помага ли на сокетите?? Ще видя ;) - person Pedro Neves; 25.10.2012
comment
Напълно без значение. Не е отговор. - person user207421; 26.10.2012