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