java.net 를 입수합니다.소켓 타임아웃예외:Android에서 연결 시간이 초과되었습니다.
안드로이드 개발은 비교적 초보입니다.웹 서버에 요청을 보내고 JSON 오브젝트를 해석하는 안드로이드 애플리케이션을 개발하고 있습니다.나는 자주 그것을 얻습니다.java.net.SocketTimeoutException: Connection timed out
서버와 통신하는 동안 예외가 발생했습니다.어떤 때는 문제없이 완벽하게 동작합니다.나는 이 같은 질문이 SO에서 여러 번 제기되었다는 것을 안다.하지만 여전히 나는 이 문제에 대한 만족스러운 해결책을 찾지 못했다.아래에 로그캣과 앱 서버 통신 코드를 게시합니다.
public JSONObject RequestWithHttpUrlConn(String _url, String param){
HttpURLConnection con = null;
URL url;
String response = "";
Scanner inStream = null;
PrintWriter out = null;
try {
url = new URL(_url);
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
if(param != null){
con.setFixedLengthStreamingMode(param.getBytes().length);
}
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
out = new PrintWriter(con.getOutputStream());
if(param != null){
out.print(param);
}
out.flush();
out.close();
inStream = new Scanner(con.getInputStream());
while(inStream.hasNextLine()){
response+=(inStream.nextLine());
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
con.disconnect();
}if(inStream != null){
inStream.close();
}if(out != null){
out.flush();
out.close();
}
}
}
로그캣:
03-25 10:55:32.613: W/System.err(18868): java.net.SocketTimeoutException: Connection
timed out
03-25 10:55:32.617: W/System.err(18868):at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
03-25 10:55:32.617: W/System.err(18868):at dalvik.system.BlockGuard
$WrappedNetworkSystem.connect(BlockGuard.java:357)
03-25 10:55:32.617: W/System.err(18868):at
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
03-25 10:55:32.617: W/System.err(18868):at
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
03-25 10:55:32.617: W/System.err(18868):at java.net.Socket.connect(Socket.java:1002)
03-25 10:55:32.621: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>
(HttpConnection.java:75)
03-25 10:55:32.621: W/System.err(18868): at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>
(HttpConnection.java:48)03-25 10:55:32.624: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect
(HttpConnection.java:322)03-25 10:55:32.624: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get
(HttpConnectionPool.java:89)03-25 10:55:32.628: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpCon
nection(HttpURLConnectionImpl.java:285)
03-25 10:55:32.628: W/System.err(18868):at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConn
ection(HttpURLConnectionImpl.java:267)
03-25 10:55:32.636: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect
(HttpURLConnectionImpl.java:205)
03-25 10:55:32.636: W/System.err(18868):at
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputS
tream(HttpURLConnectionImpl.java:614)
03-25 10:55:32.636: W/System.err(18868):at
com.myapp.core.JSONRequest.RequestWithHttpUrlConn(JSONRequest.java:63)
03-25 10:55:32.636: W/System.err(18868): at com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.java:265)
03-25 10:55:32.640: W/System.err(18868): at com.myapp.core.DetailPage
$AsyncRecBooks.doInBackground(AKBookDetailView.java:1)
03-25 10:55:32.640: W/System.err(18868): at android.os.AsyncTask$2.call
(AsyncTask.java:185)
03-25 10:55:32.640: W/System.err(18868): at java.util.concurrent.FutureTask
$Sync.innerRun(FutureTask.java:306)
03-25 10:55:32.640: W/System.err(18868): at java.util.concurrent.FutureTask.run
(FutureTask.java:138)
03-25 10:55:32.640: W/System.err(18868): at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
03-25 10:55:32.648: W/System.err(18868): at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
03-25 10:55:32.648: W/System.err(18868): at java.lang.Thread.run(Thread.java:1019)
03-25 10:55:32.652: E/JSON Parser(18868): Error parsing data org.json.JSONException:
End of input at character 0 of
누가 이 문제를 해결할 방법을 찾는 데 도움을 주실 수 있나요?잘 부탁드립니다...
웹에서 검색한 결과 접속 타임아웃 예외에 대한 문서를 많이 읽고 이해한 것은,SocketTimeoutException
우리 한계를 넘어선다.이를 효과적으로 처리하는 방법 중 하나는 접속 타임아웃을 정의하고 나중에 를 사용하여 처리하는 것입니다.try-catch
블록. 이것이 미래에 같은 문제에 직면한 모든 사람에게 도움이 되기를 바랍니다.
HttpUrlConnection conn = (HttpURLConnection) url.openConnection();
//set the timeout in milliseconds
conn.setConnectTimeout(7000);
이 질문이 좀 오래된 거 알아요.하지만 연구를 하다가 우연히 발견했기 때문에 약간의 추가가 도움이 될 수 있다고 생각했습니다.
전술한 바와 같이 네트워크 관련 문제이기 때문에 클라이언트는 에러를 해결할 수 없습니다.다만, 접속을 몇 번 재시도 할 수 있습니다.이것은, 실제의 문제가 해결될 때까지의 회피책으로서 기능하는 경우가 있습니다.
for (int retries = 0; retries < 3; retries++) {
try {
final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null);
final HttpResponse response = client.execute(get);
final int statusCode = response.getStatusLine().getStatusCode();
if (statusCode != 200) {
throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode);
} else {
return response.getEntity();
}
} catch (final java.net.SocketTimeoutException e) {
// connection timed out...let's try again
}
}
어쩌면 이게 도움이 될지도 몰라
Kotlin + Retrofit + Coroutines를 사용하시는 분들은 그냥 사용하시면 됩니다.try
그리고.catch
다음과 같은 네트워크 조작에 사용됩니다.
viewModelScope.launch(Dispatchers.IO) {
try {
val userListResponseModel = apiEndPointsInterface.usersList()
returnusersList(userListResponseModel)
} catch (e: Exception) {
e.printStackTrace()
}
}
여기서 예외는 다음 유형입니다.kotlin
이 아닌java.lang
이렇게 하면 다음과 같은 모든 예외를 처리할 수 있습니다.
- Http Exception(Http Exception)
- 소켓 타임아웃예외.
- 치명적인 예외: Default Dispatcher 등
여기 제 것이 있습니다.usersList()
기능.
@GET(AppConstants.APIEndPoints.HOME_CONTENT)
suspend fun usersList(): UserListResponseModel
주의: Retrofit Client 클래스에는 다음과 같은 기능이 필요합니다.client
OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
localhost에서 서버를 테스트하는 경우 Android 장치가 동일한 로컬 네트워크에 연결되어 있어야 합니다.그런 다음 APP에서 사용하는 서버 URL에는 "localhost" 마스크가 아닌 컴퓨터 IP 주소가 포함되어야 합니다.
EC2에 접속할 때도 같은 문제가 발생했지만 Security Group에 문제가 있어 포트 5432에 허용된 IP를 추가하여 해결했습니다.
이 문제에 직면하여 해결방법은 모뎀(라우터)을 재부팅하는 것이었습니다.그 후 앱은 인터넷에 접속할 수 있게 되었습니다.
제가 사용하고 있는 라이브러리는 몇 번밖에 되지 않아서 연결이 제대로 되지 않는 것 같습니다.
OkHttpClient에서 이 설정을 합니다.빌더() 오브젝트
val httpClient = OkHttpClient.Builder()
httpClient.connectTimeout(5, TimeUnit.MINUTES) // connect timeout
.writeTimeout(5, TimeUnit.MINUTES) // write timeout
.readTimeout(5, TimeUnit.MINUTES) // read timeout
저는 방금 어플리케이션을 다시 시작했는데 사라졌어요.에뮬레이터를 사용하고 있는 경우는, 재기동해 주세요.물리 디바이스를 사용하고 있는 경우는, 인터넷 접속을 확인합니다.한번 해봐!
제가 실수로 전표 순서를 바꾼 것과 같은 오류가 발생하였습니다.
OkHttpClient okHttpClient = new OkHttpClient().newBuilder() .connectTimeout(20, TimeUnit.SECONDS).readTimeout(20,TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS) .build();
쓰기 순서 변경 후Timeout 및 readTimeout. 오류가 해결되었습니다.마지막으로 사용한 코드는 다음과 같습니다.
OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.build();
public JSONObject RequestWithHttpUrlConn(String _url, String param){
HttpURLConnection con = null;
URL url;
String response = "";
Scanner inStream = null;
PrintWriter out = null;
try {
url = new URL(_url);
con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setRequestMethod("POST");
if(param != null){
con.setFixedLengthStreamingMode(param.getBytes().length);
}
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
out = new PrintWriter(con.getOutputStream());
if(param != null){
out.print(param);
}
out.flush();
out.close();
inStream = new Scanner(con.getInputStream());
while(inStream.hasNextLine()){
response+=(inStream.nextLine());
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
con.disconnect();
}if(inStream != null){
inStream.close();
}if(out != null){
out.flush();
out.close();
}
}
}
언급URL : https://stackoverflow.com/questions/15608499/getting-java-net-sockettimeoutexception-connection-timed-out-in-android
'source' 카테고리의 다른 글
동기화 vs 잠금 (0) | 2022.10.30 |
---|---|
Ajax 업로드 이미지 (0) | 2022.10.30 |
웹 사이트에서 현재 연도를 인쇄하는 가장 빠른 방법 (0) | 2022.10.30 |
내부 클래스에서 외부 클래스 함수를 호출합니다. (0) | 2022.10.30 |
php의 데이터를 암호화/복호화하려면 어떻게 해야 합니까? (0) | 2022.10.29 |