我有一台基本上迎合多个客户的服务器。 我基本上使用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)
答案 0 :(得分:0)
错误率是多少?这可能是随机(偶然)网络错误吗?或者您的服务器偶尔会遇到内部错误?
这听起来不像是GZip数据本身的问题,而是偶尔的网络中断。我的猜测是你的服务器偶尔会生成一个异常并发送一个无效的流,导致客户端出现这种类型的错误。也许尝试在服务器上记录所有异常以确保您不会偶尔在那里发生内部故障?
答案 1 :(得分:0)
问题是webClient
未传递给new ThreadPool()
。这只能意味着它是类的实例成员,这引入了线程安全问题。将它作为局部变量并将其显式传递给处理它的Runnable
。
请注意您的阅读代码过于乐观。你不会得到整个请求Ina单读。你必须循环。缓冲区大小为100Kb只是浪费空间:即使在解压缩后,您也不会在单次读取中接近任何位置。