基本的に複数のクライアントに対応するサーバーがあります。私は基本的に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)