如何在服务器上创建触发java.net.SocketTimeoutException的客户端

如何在服务器上创建触发java.net.SocketTimeoutException的客户端,java,tomcat,servlets,socket-timeout-exception,Java,Tomcat,Servlets,Socket Timeout Exception,我在Tomcat中有一个Servlet,它在doPost方法中读取二进制文件上传。服务器代码简化为: protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Received post request"); int read; byte[] buffer = new b

我在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上传文件。在
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();
        };
    }
}
但超时从未被触发,在服务器日志中,我甚至没有收到“已接收的post请求”,即使在我关闭客户端应用程序之后。如果我注释
sleep
,并且取消注释
break
,则会打印调试行

需要做什么样的调整(在tomcat或客户端上)才能让服务器读取抛出SocketTimeoutException?HTTP连接器在server.xml中设置为
connectionTimeout=“5000”
。故意将其设置为短于默认值20000


我正在尝试重新创建场景以进行测试。

您使用的是什么版本的Tomcat?还发现了一个问题:“connectionTimeout是指一旦建立连接,Tomcat将等待http请求行的时间。它不影响服务器等待请求完成处理的时间。”Tomcat 7.0.37。我试着在给小溪写信之前先睡觉。但服务器日志中仍然没有输出。这很奇怪。查看,我只能建议尝试
disableUploadTimeout
socket.soTimeout
选项(文档说明后者与
connectionTimeout
相同,但我对此表示怀疑)。但我认为我在这里遗漏了一些东西(可能对其他人来说是显而易见的)。