Używam HttpURLConnection
, aby przesłać obraz i uzyskać jego odpowiedź.
Działa na emulatorze i moim urządzeniu XiaoMi.
Jednak zawsze dostajesz SocketTimeoutException
na moim urządzeniu Sony pod numerem connection.getInputStream()
.
Próbowałem ustawić limity czasu na dużą wartość, np. 1 minutę, ale nie działało.
HttpURLConnection.getInputStream() wyrzuca SocketTimeoutException
public String uploadFile(File file, String requestURL) {
if (file != null) {
long fileSize = file.length();
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection connection = null;
try {
//config of connection
connection = (HttpURLConnection) new URL(requestURL).openConnection();
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
connection.setRequestMethod("PUT");
connection.setRequestProperty("Content-Type", "image/jpeg");
connection.setDoOutput(true);
connection.setRequestProperty("Content-length", "" + fileSize);
connection.connect();
//upload file
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
int bytesRead;
byte buf[] = new byte[1024];
BufferedInputStream bufInput = new BufferedInputStream(new FileInputStream(file));
while ((bytesRead = bufInput.read(buf)) != -1) {
out.write(buf, 0, bytesRead);
out.flush();
}
out.flush();
out.close();
//get response message, but SocketTimeoutException occurs here
BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));
StringBuilder sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
//return response message
return output;
} catch (Exception e) {
// Exception
e.printStackTrace();
} finally {
if (connection != null) connection.disconnect();
}
}
return null;
}
Co powoduje ten problem i jak go naprawić?
Dodatkowe informacje: Przetestowałem na urządzeniach pod tym samym łączem Wi-Fi. I pewnie serwer sieciowy i plikowy działał poprawnie. Rozmiar testowanych obrazów wynosi około 100 ~ 200kbajtów.
Czy wyjątek SocketTimeoutException występuje natychmiast po skonfigurowanym limicie czasu? – Robert
Wyjątek @Robert występuje po upływie limitu czasu – Season
Nie należy przepłukiwać wewnętrznych pętli. – EJP