我在 Tomcat 中有一个 Servlet,它在 doPost 方法中读取二进制文件上传。服务器代码简化为:
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Received post request");
int read;
byte[] buffer = new byte[10*1024];
try {
InputStream inputStream = req.getInputStream();
while ((read = inputStream.read(buffer, 0, buffer.length)) != -1) {
/* do stuff */
}
resp.setStatus(200);
} catch (Exception e) {
resp.setStatus(500);
}
}
有一些客户端应用程序使用它来 servlet 上传文件。java.net.SocketTimeoutException
很多时候,我得到一个inputStream.read()
我想编写一个测试客户端应用程序来触发服务器端异常。
我试过了:
public static void triggerTimeOut() {
HttpURLConnection urlConn = null;
try {
URL me = new URL("http://localhost:8080/uploadData");
urlConn = (HttpURLConnection)me.openConnection();
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
OutputStreamWriter sw = new OutputStreamWriter(urlConn.getOutputStream());
String[] data = new String[] {"line 1", "line 2"};
System.out.println(urlConn.getReadTimeout());
while(true) {
sw.write(data[0]);
sw.flush();
System.out.println(data[0]);
Thread.sleep(120000);
// break;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
System.out.println(urlConn.getResponseCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
};
}
}
但是永远不会触发超时,并且在服务器日志中,即使在我杀死客户端应用程序之后,我什至没有收到“收到的发布请求”。sleep
如果我评论和取消评论,调试行会打印出来break
。
需要进行什么样的调整(在 tomcat 或客户端上),以便我可以读取服务器以抛出 SocketTimeoutException?HTTP 连接器connectionTimeout="5000"
在 server.xml 中设置。它被故意设置为比默认的 20000 短。
我正在尝试重新创建场景以进行测试。