我已经在这个bug上工作了好几天了,无法解决它。
我写了一个HttpsURLConnection客户端,使用POST请求上传大文件(> 1GB)。 我还使用com.sun.net.httpserver.HttpServer实现了服务器端。 由于文件非常大,我必须在我的连接上使用:setFixedLengthStreamingMode / setChunkedStreamingMode设置 (使用其中任何一个来复制bug)。 请注意我也使用HTTPS连接进行上传。
我正在将文件同时上传到多个服务器(每个http客户端的单独线程,连接到不同的服务器)。 我已经设置了并发上传的限制,所以每次只有X个线程有一个打开的UrlConnection(错误是用X = [1..4]重现的)。 (其他线程在信号量上等待)
我的问题是这样的: 上传时间不到5分钟(准确度不到4:50分钟),一切正常。 如果第一批线程需要超过5分钟才能完成,则会为每个活动线程抛出异常:
java.io.IOException:将请求主体写入服务器时出错 at sun.net.www.protocol.http.HttpURLConnection $ StreamingOutputStream.checkError(Unknown Source) at sun.net.www.protocol.http.HttpURLConnection $ StreamingOutputStream.write(Unknown Source)
尝试写入HttpURLConnection输出流时抛出异常。 [outputStream.write(缓冲液,0,LEN);]
下一批线程可以正常工作(即使它们需要超过5个 分钟)。 请注意,服务器完全相同,现在该过程不会失败,从而导致我认为问题不在服务器端。 (如果是那么第二批也假设在5分钟后也失败了......)
我在连接上有/没有连接/读取超时重现了这个问题。 此外,在服务器端,我看到文件正在创建和增长,直到异常发生。 客户端抛出异常大约20-40秒后,服务器将抛出IOException“读取超时”。
我使用wireshark收集了一个TCP / IP示例,并且看到服务器在大约客户端异常时发送了一个FIN数据包,我不明白为什么。 (所有连接似乎都在此之前起作用)
我已经阅读了很多关于类似问题的线程,但找不到任何合适的解决方案。 (包括Using java.net.URLConnection to fire and handle HTTP requests)
关于为什么会发生这种情况的任何想法? 我怎样才能找到它的原因? 我该如何解决?
非常感谢。
P.S 我没有发布代码,因为它很长... 但如果能帮助理解我的问题,我将很乐意这样做。