Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户代码“;随机地;每当尝试创建GzipInputstream时失败_Java_Tcp_Java Io_Gzipinputstream - Fatal编程技术网

Java 客户代码“;随机地;每当尝试创建GzipInputstream时失败

Java 客户代码“;随机地;每当尝试创建GzipInputstream时失败,java,tcp,java-io,gzipinputstream,Java,Tcp,Java Io,Gzipinputstream,我有一个服务器,基本上满足多个客户端。 我基本上是使用gzip(输入/输出)流来压缩客户机和服务器之间的数据 许多客户端可以同时向服务器发送请求,因此我有一个线程来满足每个客户端的需求 现在,我遇到的问题是,在建立到服务器的连接后,每当尝试执行以下操作时,“随机”一些客户机代码就会失败 GZIPInputStream in = new GZIPInputStream(server.getInputStream()); 我得到java.io.EOFException 当我随机说的时候,我的意思是

我有一个服务器,基本上满足多个客户端。 我基本上是使用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) 
java.util.zip.GZIPInputStream.readUByte处的java.io.EOFException(未知源代码) 位于java.util.zip.GZIPInputStream.readUShort(未知源) 位于java.util.zip.GZIPInputStream.readHeader(未知源) 位于java.util.zip.gzip输入流。(未知源) 位于java.util.zip.gzip输入流。(未知源) 在com.WebServerVNCRequest.doGet(WebServerVNCRequest.java:78)
错误率是多少?可能是随机(偶尔)出现的网络错误?或者您的服务器偶尔遇到内部错误


听起来问题并不在于GZip数据本身,而是偶尔的网络中断。我猜您的服务器偶尔会生成一个异常并发送一个无效流,从而在客户端上造成这种类型的错误。也许可以尝试记录服务器上的所有异常,以确保您不会偶尔收到错误是否正在处理内部故障?

问题是
webClient
未传递给
new ThreadPool()
。这只能意味着它是类的实例成员,这会导致线程安全问题。将其设为局部变量,并将其显式传递给处理它的
Runnable


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

您好,我怀疑网络是否有问题,因为目前,客户端服务器应用程序在同一台机器上运行(出于测试目的)。如果我尝试从BufferedInputStream读取数据,那么我没有发现这些错误。我选择压缩数据的主要原因是因为我有大约130KBs的数据必须在客户端服务器之间交换,并且使用BufferedInputStream,我只能部分读取..:(!!关于上述内容的见解?如果流的类型很重要,那么代码中一定有一些奇怪的错误。是否有任何方法发布导致问题的代码?以下是我在java.util.zip.GZIPInputStream.readUShort(未知源)获得的异常堆栈跟踪..java.io.EOFException位于java.util.zip.GZIPInputStream.readUByte(未知源)位于java.util.zip.GZIPInputStream.readHeader(未知源)的java.util.zip.GZIPInputStream.(未知源)的java.util.zip.GZIPInputStream.(未知源)的com.WebServerVNCRequest.doGet(WebServerVNCRequest.java:78)TCP网络中断不会导致EOFEException。也不会导致“无效流”。当我们实例化GZIPinputstream对象(如流中所示)时,我认为问题可能是tat,如果读取的是-1,则会引发EOF。因为客户端可以访问单个服务器inputstream,所以字符读取为-1是由于上一个read()操作已完成。上述内容听起来合理吗???
InputStream.read()当流中没有更多数据时,
将返回-1,因此这仍然是症状而不是根本原因。如果删除gzip代码会发生什么?发布一个更完整的代码示例…在套接字接受循环和在单独线程中运行的代码之间使用
webClient
是不明确的。但是,
webClient
是本地的变量。等等,可能不是?没有真正的证据,代码也不会编译,因为它需要是最终的才能提供给
new ThreadPool()
,如果它是最终的,就不能重新分配。否则这不是真正的代码,在这种情况下,问题是无效的,应该结束。