3

基本的に複数のクライアントに対応するサーバーがあります。私は基本的にgzip(入力/出力)ストリームを使用してクライアントサーバー間でデータを圧縮しています。

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

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

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

私は得るjava.io.EOFException

そして、ランダムに言うと、例外で見つけることができるパターンがないことを意味します. リクエストは適切に送信されています (それ以外の場合、クライアントのリクエストに対しては機能しません)。

私はたくさん検索しました..しかし、何も見つかりませんでした.. :(

上記の問題に関する指針はありますか?

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) { }

新しい接続を受け入れ、新しいスレッドを生成するサーバー コード。

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) 
4

2 に答える 2

0

エラー率は?これらはランダムな (時折の) ネットワーク エラーである可能性がありますか? または、サーバーで時々内部エラーが発生している可能性がありますか?

問題が GZip データ自体にあるようには思えませんが、時折発生するネットワークの切断に問題があるようです。私の推測では、サーバーが時折例外を生成して無効なストリームを送信し、クライアントでこの種のエラーが発生する可能性があります。おそらく、サーバー上のすべての例外をログに記録して、時々内部エラーが発生しないようにしてください。

于 2009-07-27T03:47:21.787 に答える