2010-02-27 54 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