[英]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.