我有一段代碼從Servlet請求的輸入流中讀取POST數據。我正在使用Java nio來讀取數據。從Servlet請求輸入流讀取時的套接字超時
對於大多數情況和常規數據,代碼工作得很好。但是在某些情況下數據很大(content length = 600000
),Channel的讀取方法似乎失敗,並出現套接字超時錯誤。此外,這似乎只發生在IE 9,它與Firefox和Chrome工作正常。
在調查這個問題時,我發現,在使用IE時,發佈數據似乎比其他瀏覽器需要更長的時間才能閱讀。因此,我在代碼和代碼開始正常工作以前也使用了一個Thread.sleep(400)
。
我不想在這段代碼之前進行睡眠,一次只是一種解決方法,而不是一個正確的解決方案,其次,沒有正確的睡眠時間,因爲如果數據增加,400可能還不夠。
有沒有一種方法可以告訴頻道不要超時或完全刪除超時?
下面正在使用代碼,
ReadableByteChannel channel = Channels.newChannel(inputStream);
byte[] postData = new byte[contentLength];
ByteBuffer buf = ByteBuffer.allocateDirect(contentLength);
int numRead = 0;
int counter = 0;
while (numRead >= 0) {
buf.rewind();
numRead = channel.read(buf);
buf.rewind();
for (int i = 0; i < numRead; i++) {
postData[counter++] = buf.get();
}
}
return postData;
InputStream的是直接通過request.getInputStream()和內容長度是經由request.getContentLength()。
使用的容器是嵌入模式下的Tomcat 7.0.42。
發佈您的代碼,那麼也許我們可以幫助您! – isnot2bad
是否從您的客戶端代碼發出POST請求?如果是這樣,它是什麼技術?請參閱以下帖子瞭解java中的http請求超時:http://stackoverflow.com/questions/1414795/how-to-specify-http-request-timeout-parameter-on-java-servlet-container。 –
@MarkTielemans,是的POST是從客戶端代碼。使用SmartGWT(一個javascript工具包)。您提到的鏈接似乎提供了有關客戶端超時的詳細信息。而在我的情況下,錯誤似乎源於服務器放棄,而不是等待。 – Vicky