写的字节太多 - HttpsURLConnection

时间:2012-10-30 11:50:11

标签: java networking

我编写了一个测试servlet性能的应用程序。 我写的代码适用于一些请求。 如果我增加到更多的连接,那么有时我会得到“太多字节写”异常。

int startRange = 0, endRange = 10000;
HttpsURLConnection c = null;

c = getHttpsConnection(URL);
c.setDoInput(true);
c.setDoOutput(true);
c.setRequestProperty("Content-Length",(cotentLength+1));
c.setFixedLengthStreamingMode(contentLength+1);
c.setRequestProperty("Content-Type","appplication/zip");
c.setRequestMethod("POST");
c.setRequestProperty("Content-Range", "bytes "+startRange+"-"+endRange+"/"+filesize);

OutputStream op = c.getOutputStream();

我计算要发送到byte[] partBuf = new byte[contentLength+1];

的固定块

然后

op.write(partBuf)
String range = c.getHeaderField("Range");

in.close();
op.flush();
op.close();

我发送的某些请求没有“写入太多字节错误” 发送的请求太多,有时只给我这个错误.. 我该如何处理这种情况?

通常用于测试,我会产生一些不同的请求,分别是10,100,500,1000 ..这会触及一个以块为单位接收数据的servlet。

4 个答案:

答案 0 :(得分:1)

您的示例代码中存在许多拼写错误,因此不清楚您的真实代码的作用。然而,这看起来非常错误:

   c.setRequestProperty("Content-Range", startRange-endRange/filesize);

该标头的内容应该是String,但您似乎在发送整数值。以下是HTTP 1.1规范中应该的标题的示例。

   HTTP/1.1 206 Partial content
   Date: Wed, 15 Nov 1995 06:25:24 GMT
   Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
   Content-Range: bytes 21010-47021/47022
   Content-Length: 26012
   Content-Type: image/gif

您编辑的版本仍然不正确。它应该是这样的:

c.setRequestProperty("Content-Range", 
                     "bytes " + startRange + "-" + endRange + "/" + filesize);

...假设这些变量具有适当的值。


现在您已修复了这些错误,我的下一个怀疑点是值本身......以及contentLength值。

如果这不是答案,请考虑服务器或servlet不支持POST的“Content-Range”的可能性。

答案 1 :(得分:0)

您设置了错误的内容长度值。根本不需要设置它:Java为您做到了。只需删除代码即可。

答案 2 :(得分:0)

c.setFixedLengthStreamingMode(x)要求您将完全 x字节写入流。来自Javadocs:

  

如果应用程序尝试写更多内容,则会抛出异常   数据超过指示的内容长度,或者应用程序关闭   在写入指定数量之前的OutputStream。

例如,当我犯下以下愚蠢的错误时,我遇到了类似的问题:

http.setFixedLengthStreamingMode(body.length());
try (OutputStream os = http.getOutputStream()) {
    os.write(body.getBytes("UTF-8"));
} ...

直到body中出现重音字符为止。这使得字节长度与字符串长度不同,从而导致java.io.IOException: too many bytes written

为了让事情更加混乱,try-with-resources引发了另一个例外:Suppressed: java.io.IOException: insufficient data written。我仍然不确定它来自哪里,但当我通过适当的长度setFixedLengthStreamingMode时,它就消失了。

答案 3 :(得分:0)

我遇到了此override fun getItemCount(): Int错误,它是由于正文中的非ASCII字符而发生的。发送代码错误地假定文本的长度等于字符数。由于该代码是一种测试工具,因此删除这些字符比修复该代码更容易。