2016-04-08 14 views
-1

Javaソケットクライアントを実行しています。これは、最初に実行した場合、または最初の数回実行した場合に機能します。ただし、半日のデバッグ後、TCPソケットを読み取るDataInputStreamのreadByte()メソッドはjava.io.EOFExceptionをスローします。 Eclipseを再起動したり、同じJavaコードをスタンドアロンで実行しても問題はありません。私は、Eclipseの実行/ Javaコードのデバッグの仕方と関係があると考えています。どういうわけか、プログラムをデバッグするたびにリソースが使用され、その後にはリリースされません。誰も知っている?私のJavaソケットプログラムは、Eclipseから実行中にjava.io.EOFExceptionを返します

は、ここでは、while(true)(あるいはそもそもwhile(true)ループを持っている)のうちbreakに良い習慣ではありません、コード一般的に

//DataInputStream is set outside of the scope. 

DataInputStream dataInputStream; 

StringBuffer stringBuffer = new StringBuffer(); 
while(true) 
{ 
    // java.io.EOFException is thrown at the line below. 
    byte c = dataInputStream.readByte(); 
    if(c == 0) { 
     break; 
    } 
    stringBuffer.append((char)c); 
} 
+3

単純な推測のコードはありません。答えを受け取るために、コードとスタックトレースを追加することができます。 – SomeJavaGuy

+0

コードスニペットが追加されました。 –

+1

反対側がタイムアウトしてソケットをシャットダウンする可能性があります。 –

答えて

-1

です。バイト== 0であっても、データストリームの最後に到達したわけではありません。 nullバイト(Javaの場合は0)が読み込まれる(available()のようなものを使用している)と仮定するのではなく、実際にストリームから読み込むことができるデータがあるかどうかを確認する必要があります。簡単な修正は、本の線に沿って何かを見ることができる:

DataInputStream dataInputStream; 

StringBuffer stringBuffer = new StringBuffer(); 
while(dataInputStream.available() > 0) 
{ 
    byte c = dataInputStream.readByte(); 
    stringBuffer.append((char)c); 
} 

これがEOFに達したときに停止だけでなく、あなたのStringBufferに文字を追加し続けなければなりません。

+0

これは意味がありません。コードのこの部分が通常は機能するからです。Eclipseの内部と半日の実行後に作業が停止するだけです。 –

+0

@AlbertChengあなたが投稿したコードがあれば、これは私が考えることができる唯一の解決策です。この答えが解決しようとしているEOF例外があることを除いて、あなたの質問はあまり説明しません。 –

関連する問題