2012-05-04 5 views
0

Telnetクライアントが切断されたときにIOExceptionがスローされないという問題があります。 Telnetが終了したときにBufferedReaderまたはSocketが例外をスローしない

は、私は、次のソースからサーバーコードを使用:指定されたコードから

http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/Code/SocketThrdServer.java

、サーバが終了し、「失敗を読む」ときに、クライアントの近くに表示されるはずです。しかし、Telnetやパテ(RAW接続)ではこれが起こっていません。それどころか、私はクライアントの例を使ったときに動作しますが、それは完全に動作します。

また、readLine()がI/Oを常にブロックするのではなく、タイムアウトを使用するようにコードを修正しようとしました。しかし、クライアントが切断されているかどうかを検出するのに役立つとは思われません。

while (true) { 
     try { 
      client.setSoTimeout(1000); 
      line = in.readLine(); 
      // Send data back to client 
      out.println(line); 
      textArea.append(line); 

     } catch (SocketTimeoutException ex) { 
      if(client.isClosed()) { 
       System.out.println("Client disconnected"); 
       System.exit(-1); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      System.out.println("Read failed"); 
      System.exit(-1); 
     } 
    } 

Telnetまたは未接続を使用してから行方不明何かはありますか?

編集:私は2つのクライアントを実行し、私は最初のクライアントを閉じたときに、それは正常なシャットダウンならはそれに加えて、そこにすべきで、

答えて

1

... BufferedReaderのからスローされる例外はないだろうIO例外はありません。 in.readLine();は、この場合、コードで処理する必要がある場合のnullを返す必要があります。

+0

さて、私はその理由に答えていると思います。しかし、私は、正常なクローズがソケットの状態をクローズにしないのはなぜだろうか不思議です。これは、ソケットがまだ閉じていないと考えているので、isClosed()を無効にします... –

+0

まあ、私はちょうどisClosed()signifysがわかりませんが、TCP接続は、 TCP RSTを送信します)。 TCP接続は、半二重状態にすることができます。片方の端は書き込み方向を閉じていますが、もう一方の端はデータを送信できます。 – nos

+0

@Seeyabye TCPには「ダイヤルトーン」はありません。そのため、あるソケットは、接続先のI/Oを試みる以外の方法でソケットが閉じられたことを知ることができません。 'isClosed()'であり、あなたのソケットに行ったことだけを友人が教えてくれます。接続に何が起こったのかは分かりません。 – EJP

関連する問題