【问题标题】:Unable to upload zip files occasionally偶尔无法上传 zip 文件
【发布时间】:2009-06-16 15:11:01
【问题描述】:

Tomcat 服务器在美国运行。我正在使用 Java 的 HTTPURLConnection 从中国连接到服务器。请看下面客户端使用的代码sn-p和tomcat服务器端的https连接器配置。

<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
    <Connector acceptCount="100" clientAuth="false" connectionTimeout="-1" debug="4" disableUploadTimeout="true" enableLookups="false" keystoreFile="conf/server.keystore" keystorePass="passw47d" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="443" scheme="https" secure="true" sslProtocol="TLS" useBodyEncodingForURI="true"/>


    URL url=new URL(urlString);
    HttpsURLConnection connection=null;
    try
    {
        connection=(HttpsURLConnection)url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type", "application/zip");
        connection.setRequestProperty("Transfer-Encoding", "chunked" );
        connection.setChunkedStreamingMode(4096);
        connection.connect();
        sout=new BufferedOutputStream(connection.getOutputStream());
        break;
    }
    catch(FileNotFoundException exc)
    {
        throw exc;
    }
    bis=new FileInputStream(zipfile);

    int i;    
    byte bytes[]=new byte[4096]; 
    while((i=bis.read(bytes))!=-1)
    {
        sout.write(bytes,0,i);
        sout.flush();
    }  
    sout.close();
    bis.close();

客户端大部分时间都成功上传了 zip 文件。有时客户端程序会抛出以下异常。

java.io.IOException: Error writing request body to server
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at SendFiles.sendNowThruHttp(SendFiles.java:449)
at SendFiles.run(SendFiles.java:180)

可能是什么问题?

【问题讨论】:

    标签: java https


    【解决方案1】:

    可能是网络超时。但可以肯定的是,请查看服务器日志文件。它们也将包含一条错误消息。

    我还建议看一下HttpClient Java library,它使这些事情变得更加简单可靠。示例见this article(接近尾声)。

    【讨论】:

    • +1 用于 Apache HttpClient。它具有内置的错误处理逻辑,可以简单地重试大多数基本错误的请求,并允许您指定自己的逻辑。
    • 我在 Tomcat 端设置了 disableUploadTimeout="true" 属性。所以我认为它不会超时。
    • @Jay:如果客户端/服务器没有回复,TCP 连接将在两分钟后超时。此值无法更改,它位于您计算机的 TCP/IP 堆栈中。
    猜你喜欢
    • 2010-09-29
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多