2012-03-26 9 views
0

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?

Antwort

1

Versuchen Sie setSoTimeout zu verwenden, um eine Zeitüberschreitung für Ihre Lese(), dann müssen Sie nur die SocketTimeoutException abfangen, wenn der Timer abgelaufen ist.

+0

Das klingt wie eine gute Idee, ich werde es versuchen –

+0

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

0

Hier break und weiter keywords sind deine freunde.

1

Der einfachste Ansatz besteht darin, zwei Threads zu verwenden. Auf diese Weise müssen Sie Ihren eigenen Zeitplancode nicht schreiben, um festzustellen, welcher Thread ausgeführt werden soll. BTW: Der Code zum Kopieren von einem Socket zu einem anderen ist in jedem Thread identisch, was die Duplizierung reduziert.

Um Ihre Threads zu verwalten, würde ich einen ExecutorService verwenden, der das Herunterfahren von E-Threads erleichtert.

Verwandte Themen