[英]Java - Why while(true){ inputStream.read(incomingData) } does not work?
[英]What is intended for "while(inputStream.read()) >=0)" in Compatibility Test Suite?
我发现我的项目在使用 CTS(兼容性测试套件)进行测试的过程中意外卡住了 30 秒。 这是 CTS 中com.sun.ts.tests.servlet.api.jakarta_servlet_http.httpservletrequest40的代码( 原始来源链接)
try {
url = new URL("http://" + hostname + ":" + portnum + CONTEXT_ROOT
+ "/TrailerTestServlet");
socket = new Socket(url.getHost(), url.getPort());
socket.setKeepAlive(true);
output = socket.getOutputStream();
String path = url.getPath();
StringBuffer outputBuffer = new StringBuffer();
outputBuffer.append("POST " + path + " HTTP/1.1" + DELIMITER);
outputBuffer.append("Host: " + url.getHost() + DELIMITER);
outputBuffer.append("Connection: keep-alive" + DELIMITER);
outputBuffer.append("Content-Type: text/plain" + DELIMITER);
...
byte[] outputBytes = outputBuffer.toString().getBytes(ENCODING);
output.write(outputBytes);
output.flush();
input = socket.getInputStream();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
int read = 0;
**while ((read = input.read()) >= 0)** {
bytes.write(read);
}
String response = new String(bytes.toByteArray());
如标题中所述,在服务器(我的代码)完成对该请求的响应后,线程在“while((read = input.read()) >= 0)”处被阻塞。 在我的理解中,请求包括“Connection: keep-alive”,服务器在响应后不关闭此连接,最终在(服务器端)SocketTimeout 中关闭连接。
我认为此流程似乎是合理的,因为请求说“保持此连接处于活动状态”并且它不会让 input.read() 在 SocketTimeout 或任何异常之前到达 stream 的末尾。
回到我的问题。“while(inputStream.read()) >=0)”和“keep-alive”的目的是什么?
谢谢。
我从 github( https://github.com/jakartaee/platform-tck/blame/484ce8691c41dde5ab2648f1c9e056487c36775c/src/com/sun/ts/tests/servlet/api/jakarta_servlet_java0/#servlet29/#servlet29 ) 却找不到合理的理由。
你是对的。 此循环等待服务器关闭连接,但服务器已被告知如果可能请不要关闭连接。 这显然是一个错误,或者超时可能是有意的,而且它是非常懒惰的编码。
但是,这看起来像是针对特定 web 服务器的测试代码,因此服务器上的某些内容可能会阻止连接保持活动状态。 如果客户端或服务器需要,连接将在第一次请求和响应后关闭。 我在TrailerTestServlet 中看不到任何会强制服务器关闭连接的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.