2009-07-27 11 views
3

私は基本的に複数のクライアントをサポートするサーバーを持っています。 私は基本的にgzip(入力/出力)ストリームを使用してクライアント - サーバー間のデータを圧縮しています。GzipInputstreamを作成しようとすると、クライアントコードが「ランダムに」失敗する

多くのクライアントが同時にサーバーに要求を送信できるため、各クライアントに対応するスレッドがあります。

私が抱えている問題は、サーバーへの接続が確立された後に次のコードを実行しようとするたびに、「ランダムに」一部のクライアントコードが失敗することです。

GZIPInputStream in = new GZIPInputStream(server.getInputStream()); 

java.io.EOFExceptionとなります。

ランダムに言うと、私が例外で見つけることができるパターンがないことを意味します。 要求が正しく送信されています(そうでない場合は、クライアントの要求に対しては機能しません)。上記の問題について、私は何かを見つけることができませんでしたlot..butを検索しました

.. :(

任意のポインタ?

Socket connection= new Socket("localhost",2428); 
GZIPOutputStream out = new GZIPOutputStream(connection.getOutputStream()); 
out.write(url.getBytes()); 
out.finish(); 
GZIPInputStream in=null; 

try { 
    in = new GZIPInputStream(connection.getInputStream(),1024); // Exception raised here 
} catch(Exception e) { } 
新しい接続を受け入れ、新しいを生成します

Serverのコードスレッド。

ServerSocket dsWeb= new ServerSocket(2428); 
Socket webClient; 
while(true){ 
webClient = dsWeb.accept(); 

executor.execute(new ThreadPool()); // each request to be handled by a separate thread 

スレッド内のコード..

GZIPInputStream inWeb = new GZIPInputStream(webClient.getInputStream()); 
int c1=0; 
byte[] b1 = new byte[100000]; 
c1=inWeb.read(b1); 
//Process the request 
GZIPOutputStream outWeb = new GZIPOutputStream(webClient.getOutputStream()); 
outWeb.write(/* Response */); 
outWeb.finish(); 

ここで私が得る例外のスタックトレースです:

java.io.EOFException at java.util.zip.GZIPInputStream.readUByte(Unknown Source) 
at java.util.zip.GZIPInputStream.readUShort(Unknown Source) 
at java.util.zip.GZIPInputStream.readHeader(Unknown Source) 
at java.util.zip.GZIPInputStream.<init>(Unknown Source) 
at java.util.zip.GZIPInputStream.<init>(Unknown Source) 
at com.WebServerVNCRequest.doGet(WebServerVNCRequest.java:78) 
+0

スタックトレースを追加できますか? – akf

+0

私は、GZIPinputstreamオブジェクトをhttp://kickjava.com/src/java/util/zip/GZIPInputStream.java.htmに示すようにインスタンス化すると、ストリームが読み込まれ、EOFがスローされる-1を読み取ります。クライアントがアクセスするための単一のサーバー入力ストリームが存在するため、-1と読み取られた文字は以前のread()アクションのために発生します。上記の音は妥当か? –

+0

'InputStream.read()'はストリームにデータがなくなると-1を返します。それでも根本的な原因ではない症状です。 –

答えて

0

エラーレートとは何ですか?これらはランダム(時折)のネットワークエラーである可能性がありますか?または、おそらくあなたのサーバーで内部エラーが発生することがありますか?

GZipデータ自体が問題になるのではなく、ときどきネットワークが途切れているようです。私の推測では、サーバが例外を生成し、無効なストリームを送信して、クライアントでこの種のエラーが発生することがあります。おそらく、サーバー上のすべての例外をログに記録して、そこで内部的な障害が発生しないようにしてください。

+0

こんにちは、 ネットワークが問題であるかどうかは疑問ですが、クライアントとサーバーのアプリケーションは同じマシン上で(テスト目的で)実行されています。 もし私がBufferedInputStreamから読み込もうとすると、これらのエラーのどれも見つかりません。 私はデータを圧縮するために私が選んだ主な理由は、クライアント - サーバ間で交換しなければならない約130KBのデータBufferedInputStream、私は部分的にしか読み込めませんでした.. :(!! 上記の洞察? –

+0

ストリームのタイプが問題であれば、コードに奇妙なバグがあるはずです。 はjava.util.zip.GZIPInputStream.readUByteで\t java.io.EOFException ..私が得る例外の – jsight

+0

相続スタックトレース?問題の原因(不明なソース)java.util.zip.Gで \t ZIPInputStream.readUShort(Unknown Source) \t(java.util.zip.GZIPInputStream.readHeader)(不明なソース) \t(java.util.zip.GZIPInputStream) (不明な情報源) \t(java.util.zip.GZIPInputStream) (不明なソース) \t com.WebServerVNCRequest.doGet(WebServerVNCRequest.java:78) –

0

new ThreadPool()にはwebClientが渡されないという問題があります。これは、クラスのインスタンスメンバであることを意味するだけで、スレッドセーフティの問題が発生します。それをローカル変数にして、その変数を処理するRunnableに明示的に渡します。

あなたの読書コードは、過度に楽観的です。あなたは一回の読書で全部のリクエストを受けることはありません。ループする必要があります。 100Kbのバッファー・サイズはスペースを無駄にするだけです。デジップ後も、1回の読み取りでそれに近い場所は得られません。

+0

しかし、 'webClient'はローカル変数です。 –

+0

ホールド、おそらくない? –

+1

実際の証拠はなく、コードはコンパイルされません。新しいThreadPool()で使用できるように最終的にする必要があり、最終的な場合は再割り当てできませんでした。そうでなければ、これは実際のコードではありません。この場合、問題は無駄で、閉じなければなりません。 – EJP

関連する問題