2017-06-04 2 views
2

私は単純なtcpストリームのSMTPサーバーを作成しています。クライアント接続がまだ利用可能かどうかを確認するために、次のコードを記述しました。ソケット入力ストリームが動作しているかどうかを調べるために、単に1バイトを調べます。しかし、in.mark(x)先読み制限を1に設定すると、2回目にヘッダーを送信しようとするとエラーが表示されます。 2に設定すると、まったく問題はないようです。どうしてこれなの?クライアントが接続を閉じるかどうかを確認する際のreset()エラー

// check if client disconnected 
try { 
    in.mark(1); // 1 char read ahead limit 
    if (in.read() == -1) { 
     System.out.println("CONNECTION CLOSED BY CLIENT!"); 
     return; // end of thread 
    } else { 
     in.reset(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
    throw new RuntimeException(); 
} 

私が手にエラーがこれです:

java.io.IOException: Mark invalid 
    at java.io.BufferedReader.reset(BufferedReader.java:512) 
    at smtp.server.SocketThread.run(SocketThread.java:59) 

コード全体がmy githubです。

+1

忘れてください。読んで書いて、例外が発生したときにそれを処理してください。現在あなたは占いに従事しています。クライアント接続が現在生存しているかどうかを示すメソッドが見つかったとしても、このメソッドと次のコード行を呼び出す間に下がる可能性があります。リソースが利用可能かどうかを検出しようとする実際に動作する唯一の方法は、通常の方法でリソースを使用しようとすることです。 – EJP

+0

@EJP私はあなたがそれを置くのが好きです、「占いを言う」。実際には私があなたの答えを受け入れるでしょう。洞察のために非常に感謝します。 – viz

+0

こちらはOKです。 – EJP

答えて

2

忘れてしまった。読んで書いて、例外が発生したときにそれを処理してください。

現在、あなたは占いに従事しています。クライアント接続が現在生存しているかどうかを示すメソッドが見つかったとしても、このメソッドと次のコード行を呼び出す間に下がる可能性があります。

リソースが利用可能かどうかを実際に検出しようとする唯一の方法は、通常の方法でリソースを使用しようとすることです。

関連する問題