Java 写入的字节太多-HttpsURLConnection

Java 写入的字节太多-HttpsURLConnection,java,networking,Java,Networking,我已经编写了一个应用程序来测试servlet的性能。 我编写的代码可以很好地处理一些请求。 如果我增加到更多连接,那么有时会出现“写入的字节太多”异常 int startRange = 0, endRange = 10000; HttpsURLConnection c = null; c = getHttpsConnection(URL); c.setDoInput(true); c.setDoOutput(true); c.setRequestProperty("Content-Length

我已经编写了一个应用程序来测试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=newbyte[contentLength+1]的固定块

然后

对于发送的某些请求,我不会收到“太多字节写入错误”, 发送的请求太多,有时会出现此错误。。 我如何处理这种情况


通常为了测试,我会产生一些从101005001000不等的请求。。哪个inturn命中了一个以块形式接收数据的servlet。

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

   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的“内容范围”的可能性。

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

c.setFixedLengthStreamingMode(x)
要求您准确地将字节写入流。从Javadocs:

如果应用程序尝试写入更多内容,将引发异常 数据长度超过指定的内容长度,或者如果应用程序关闭 写入指定数量之前的OutputStream

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

http.setFixedLengthStreamingMode(body.length());
try (OutputStream os = http.getOutputStream()) {
    os.write(body.getBytes("UTF-8"));
} ...
正文
中出现重音字符之前,此操作一直有效。这使得字节长度与字符串长度不同,从而导致
java.io.IOException:写入的字节太多


为了让事情更加混乱,使用资源的尝试导致了另一个异常:
被抑制:java.io.IOException:写入的数据不足
。我仍然不确定这是从哪里来的,但当我将适当的长度传递到
setFixedLengthStreamingMode

时,它消失了。我遇到了这个
java.io.IOException:太多字节无法写入流
错误,这是由于正文中的非ASCII字符造成的。发送代码错误地假定文本长度等于字符数。由于代码是测试线束,因此删除这些字符比修复代码更容易。

。。我已经编辑并修复了我的打字错误。。请告诉我可以做些什么来修复它?这与我打开连接的方式有关吗?我是否应该将连接设置为类中的成员数据,并对每个线程请求重复使用相同的连接?是的,请忽略输入错误。。测试应用程序运行良好。。正如我已经提到的,完整的程序包含了这些内容。请告诉我解决方法。内容长度是正确的,例如,如果我使用这个应用程序运行测试,比如说50或100个线程,它们运行得很好,没有任何错误,但是随着线程数量的增加,我出现了这个错误我尝试了这个,甚至出现了这个错误。每个线程尝试上载1MB文件,这些文件以30KB的块发送,因此每次发送30KB的块时,都会打开一个连接,然后断开连接。
http.setFixedLengthStreamingMode(body.length());
try (OutputStream os = http.getOutputStream()) {
    os.write(body.getBytes("UTF-8"));
} ...