我编写了一个测试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。
答案 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字符而发生的。发送代码错误地假定文本的长度等于字符数。由于该代码是一种测试工具,因此删除这些字符比修复该代码更容易。