繁体   English   中英

BufferedReader.readLine()方法阻塞替代

[英]BufferedReader.readLine() method Blocking alternative

有什么方法可以使方法readline()(来自bufferedReader)阻塞,直到实际上有一些要读取的东西为止?

我正在创建一个基于socketBase的客户端/服务器应用程序,我有这个

服务器先读取然后再写入。 客户端写入然后读取..这是客户端/服务器之间的通信(基于套接字)

唯一的问题是,在服务器上我正在使用bufferedReader.readLine()进行读取,这不是一个阻塞方法。 我已经尝试过用dataInputstream()。read()替换bufferedReader.readLine()(处理所有字节填充并在收到-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是将客户端连接到服务器的套接字。

这里的问题是。 当客户端连接到服务器时,服务器希望在建立连接后立即从套接字读取..但是,仅当用户按下按钮时,客户端上的代码(写入服务器)才有望运行。 ,则必须阻塞服务器,直到客户端实际上向套接字写入了其他内容为止(服务器没有阻塞)。 :-/希望这次让我更加清楚。

BufferedReader.readLine()始终阻塞,直到找到'\\n'为止。

如果您能举例说明要发送的数据,我可能会为您提供进一步的帮助。

尝试使用文件锁定方法,例如:

file = new RandomAccessFile("file.txt", "rw");
FileChannel channel = file.getChannel();
fl = channel.tryLock();
// file now is locked
fl.release();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM