与HttpsURLConnection建立连接后,我读取了输入缓冲区。一切正常,但如果返回的数据为空(只有200字节,则为0字节) reader.readLine()引发IOException。 (编辑:它实际上是超时)
我可以在reader.readLine()之前写什么IF语句,所以我可以提前发现它?
注意:一个棘手的部分可能是我们仍然需要等待缓冲区接收到所有内容,因此IF需要“我们收到了所有内容,但没有任何内容。”
谢谢!
HttpsURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL("https://example.com/GiveMeSomTextPlain");
connection = (HttpsURLConnection) url.openConnection();
connection.setConnectTimeout(9000);
connection.setReadTimeout(11000);
connection.connect();
int resp = connection.getResponseCode();
if (resp == 200) {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
// if( reader.ThereWillBeNoData() ){ // THIS IS WHAT I NEED
// ...
// }
String line = "";
while( ( line = reader.readLine() ) != null ){ // EXCEPTION IF EMPTY DATA
// ...
}
}else{
reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
}
} catch (IOException e) {
e.printStackTrace();
// WE GET HERE AT EXCEPTION
} finally {
if (connection != null) connection.disconnect();
try {
if (reader != null) reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
编辑:啊,似乎它在超时结束时(对应于我输入的11s)但“空”也是一个答案,那么如何避免超时? (见我的回应)
STACK TRACE:
09-13 18:39:40.134 20925-21658/com.theapp D/ZZZ: BEFORE WHILE
09-13 18:39:51.155 20925-21658/com.theapp W/System.err: java.net.SocketTimeoutException: Read timed out
09-13 18:39:51.155 20925-21658/com.theapp W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
09-13 18:39:51.155 20925-21658/com.theapp W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:690)
09-13 18:39:51.155 20925-21658/com.theapp W/System.err: at java.io.BufferedInputStream.read(BufferedInputStream.java:283)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at com.android.okhttp.internal.http.UnknownLengthHttpInputStream.read(UnknownLengthHttpInputStream.java:39)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at java.io.InputStreamReader.read(InputStreamReader.java:233)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at java.io.BufferedReader.fillBuf(BufferedReader.java:145)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at java.io.BufferedReader.readLine(BufferedReader.java:397)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at com.theapp.Main.getMapData(Main.java:637)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at com.theapp.Main$2$2.run(Main.java:231)
09-13 18:39:51.165 20925-21658/com.theapp W/System.err: at java.lang.Thread.run(Thread.java:841)
09-13 18:39:51.165 20925-21658/com.theapp D/ZZZ: EXCEPTION
答案 0 :(得分:0)
问题原因:
没有数据时,服务器未发送内容长度。
这似乎是一个模棱两可的问题,因为在这种情况下是否应该发送Content-Length并不是很清楚。 Web浏览器很好地处理Content-Length的缺失,并且似乎假设它意味着0.但是,Android HttpsURLConnection没有,并且一直等到超时。我们可能会争辩说,没有数据应该是204 HTTP响应代码而不是200。
所以,如果有人遇到同样的问题:
要么确保服务器在正文为空时发送Content-Length:0
或者在这种情况下发送204。