У меня есть 2 сокета, и я использую BufferedReader для его входных потоков. То, что я пытаюсь сделать, это взять все входные данные из первого сокета и отправить их в другой сокет (и наоборот).
Проблема в том, что если первый сокет не отправляет сообщение, он все равно будет блокироваться на первом readLine(), даже если второй сокет уже отправил некоторые данные и готов. Я хотел бы продолжить этот простой подход без использования дополнительных потоков.
Вот некоторый код, который я написал, как вы можете видеть, у меня есть 2 BufferedReaders (in0 и in1), программа зависает на in0.readLine() (блокировка).
private void network()
{
PrintWriter out0 = null, out1 = null;
BufferedReader in0 = null,in1 = null;
try{
//clients[] is an array of Socket[2]
in0 = new BufferedReader(new InputStreamReader(clients[0].getInputStream()));
out0 = new PrintWriter(clients[0].getOutputStream(), true);
in1 = new BufferedReader(new InputStreamReader(clients[1].getInputStream()));
out1 = new PrintWriter(clients[1].getOutputStream(), true);
} catch (IOException e) {
System.out.println("Accept failed: 4445");
System.exit(-1);
}
int count = 1;
while(true)
{
System.out.println("network check loop # " + count);
++count;
String nextMessage = null;
try {
if( (nextMessage = in0.readLine()) != null)
{
this.relayMessage(nextMessage,out1);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Middle of network check loop");
nextMessage = null;
try {
if((nextMessage = in1.readLine()) != null)
{
this.relayMessage(nextMessage,out0);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Как я могу просто пропустить этот оператор, если in0 не готов предоставить мне некоторые данные? Я видел метод ready() BufferedReader и пытался использовать in0.ready() && readLine()
, но это приводит к бесконечному циклу, поскольку ни один из буферизованных считывателей никогда не оказывается «готовым». Кроме того, я уверен, что сообщения, отправляемые через сокет, заканчиваются символами новой строки, поэтому функция readLine() должна работать корректно!
Любые идеи?