BufferedReader.readLine()方法阻塞替代方法

时间:2012-10-25 16:35:04

标签: java sockets networking network-programming network-protocols

有没有办法让方法readline()(来自bufferedReader)块直到它实际上有东西要读?

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

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

唯一的问题是在服务器上我正在使用bufferedReader.readLine()读取,这不是阻塞方法。我已经尝试用dataInputstream()替换bufferedReader.readLine()。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是一个连接客户端到服务器的套接字。

这里的问题是。当客户端连接到服务器时,服务器希望在建立连接后立即从套接字读取..但是客户端上的代码(写入服务器)只能在用户按下按钮时运行..所以,服务器必须被阻塞,直到客户端实际上向套接字写入了一些东西(服务器没有阻塞)。 : - /希望这次让自己更清楚..对不起

2 个答案:

答案 0 :(得分:2)

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

如果你能提供你正在发送的数据的例子,我可能会进一步帮助你。

答案 1 :(得分:-1)

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

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