3

我有一个基本上可以满足多个客户的服务器。我基本上使用 gzip(input/output)stream 来压缩客户端-服务器之间的数据。

许多客户端可以同时向服务器发送请求,因此我有一个线程来满足每个客户端的需求。

现在,我遇到的问题是,在建立与服务器的连接后,每当尝试执行以下操作时,某些客户端代码“随机”失败。

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 回答
0

问题是webClient没有传递给new ThreadPool(). 这只能意味着它是类的实例成员,这会引入线程安全问题。使其成为局部变量并将其显式传递给Runnable处理它的对象。

注意您的阅读代码过于乐观。您不会在一次读取中获得整个请求。你必须循环。100Kb 的缓冲区大小只是浪费空间:即使在解压缩之后,单次读取也不会接近该大小。

于 2016-08-10T01:20:50.887 回答