2010-02-27 51 views
0

我已经写了Java(和Jetty)中的排序代理。无论如何,它工作的很好,但有时Java:写在HttpServlet中的IOException

... 
final OutputStream realOs = res.getOutputStream(); 
... 
InputStream is = url.openStream(); 
int i; 
while ((i = is.read(buffer)) != -1) { 
    realOs.write(buffer, 0, i); 
} 

失败,IOException。我注意到,这主要与大的二进制文件,也就是闪光灯和Safari浏览器发生......

我疑惑...

+3

你能展示一些真实的堆栈痕迹吗? – 2010-02-27 20:43:01

+0

你在'read()'或'write()'上得到异常吗? – skaffman 2010-02-27 20:59:44

+0

不幸的是,没有堆栈痕迹。我的意思是,我尝试打印它们,但e.getMessage()为空,并且e.getStackTrace()也不返回任何内容 – Demiurg 2010-02-27 21:01:35

回答

2

如果浏览器关闭时就会发生这种情况(或用户取消下载),而您仍然在写入套接字。浏览器关闭了套接字,因此您的OutputStream不再有任何要写入的内容。

不幸的是,很难确定这是否确实如此 - 在这种情况下,这不是问题 - 或者是否有更阴险的事情发生。

+0

我确定浏览器没有关闭 - 在这种特殊情况下,即单元测试,我是用户 – Demiurg 2010-02-27 21:02:43

+0

那么您究竟如何测试呢?客户看到什么? – 2010-02-27 21:37:19

+0

正如我所提到的,您可以将我的应用程序视为代理。客户端是一个普通的浏览器,可以看到通过此代理加载的普通网页。这个问题 - 有时像网页中嵌入的图像和闪光灯等对象不会被加载。 – Demiurg 2010-02-27 22:44:38