【发布时间】:2010-11-14 06:04:05
【问题描述】:
我的服务器基本上可以满足多个客户的需求。 我基本上是使用 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)
【问题讨论】:
-
当我们实例化 GZIPinputstream 对象时,我假设的问题可能是 tat,如kickjava.com/src/java/util/zip/GZIPInputStream.java.htm 所示,读取流并在读取 -1 时抛出 EOF。因为,有一个单一的服务器输入流供客户端访问,读取为 -1 的字符是由于之前的 read() 操作完成的。以上听起来有道理吗??
-
InputStream.read()将在流中没有更多数据时返回 -1,因此这仍然是症状而不是根本原因。 -
如果您删除 gzip 代码会怎样?
-
发布一个更完整的代码示例...在您的套接字接受循环和在单独线程中运行的代码之间使用
webClient是模糊的。
标签: java tcp java-io gzipinputstream