Ich habe 2 Sockets und ich verwende BufferedReader um seine InputStreams. Was ich versuche zu tun, ist, alle Eingaben von der ersten Steckdose zu nehmen und sie an die andere Steckdose zu senden (und umgekehrt).Java BufferedReader, wie nur aufrufen, wenn nicht blockiert?
Das Problem ist, dass, wenn der erste keine Nachricht sendet, immer noch auf der ersten readLine() blockiert wird, obwohl der zweite Socket bereits einige Daten gesendet hat und bereit ist. Ich möchte mit diesem einfachen Ansatz fortfahren, keine zusätzlichen Threads zu verwenden.
Hier ist ein Code, den ich geschrieben habe, wie Sie sehen können Ich habe 2 BufferedReaders (in0 und in1), das Programm bleibt bei in0.readLine() (Blockierung) stecken.
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();
}
}
}
Wie kann ich diese Aussage einfach überspringen, wenn in0 nicht bereit ist, mir einige Daten zu geben? Ich habe die ready() -Methode von BufferedReader gesehen und versucht, in0.ready() && readLine()
zu verwenden, aber dies verursacht eine Endlosschleife, da keiner der gepufferten Leser jemals 'bereit' zu sein scheint. Außerdem bin ich sicher, dass die Nachrichten, die über den Socket gesendet werden, in Newline-Zeichen enden, so dass readLine() korrekt verarbeitet werden sollte!
Irgendwelche Ideen?
Das klingt wie eine gute Idee, ich werde es versuchen –
Werfen Sie auch einen Blick auf, was ist ein "non-blocking Socket", es ist mit SetSoTimeout verwandt und könnte das sein, was Sie suchen. (Sie werden viele Beispiele über Google finden) – NeeL