1

我编写了一个测试 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

4 回答 4

1

您的示例代码中有许多错字,因此不清楚您的真实代码是做什么的。然而,这看起来非常错误:

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

该标头的内容应该是一个字符串,但您似乎正在发送一个整数值。这是 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”的可能性。

于 2012-10-30T12:04:00.547 回答
1

我遇到了这个java.io.IOException: too many bytes to write to stream错误,它是由于正文中的非 ASCII 字符而发生的。发送代码错误地假定文本长度等于字符数。由于代码是一个测试工具,删除这些字符比修复代码更容易。

于 2020-09-07T13:52:59.957 回答
1

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

于 2018-05-03T14:31:03.260 回答
0

您设置了错误的内容长度值。根本不需要设置它:Java 会为您完成。只需删除代码。

于 2012-10-30T20:55:00.253 回答