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