본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/안드로이드 스튜디오

HttpURLConnectionImpl.java:250 오류 해결하기

by 미노드 2016. 12. 13.

안드로이드에서 php를 통해 데이터를 끌어오는 중 에러가 발생했다.

근데 소스의 문제가 아니다.

intent를 통에 받아온 값으로 AsyncTask를 통해 php에 전달하여 값을 받는 방식인데

5, 7, 9    3개 값 중에 7만 안된다... 

웹 브라우저를 통해서 5, 7, 9 값을 전달해보면 3개 다 정상적으로 받아지고 정상적으로 값을 반환한다.


만일 안되려면 3개 값 모두 안되어야하는데, 안드로이드에서만, 특정값만 안되다보니 더욱 어디가 틀렸는지 찾기 힘들었다.




W/System.err: java.io.FileNotFoundException: http://151.170.73.171:8321/appcon/remake/quizb_listb.php

W/System.err:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:250)

W/System.err:     at logistics.image.quiz.wanttoquizman.ActQuizb_Problem_A$back_quizbloop.doInBackground(ActQuizb_Problem_A.java:456)

W/System.err:     at logistics.image.quiz.wanttoquizman.ActQuizb_Problem_A$back_quizbloop.doInBackground(ActQuizb_Problem_A.java:427)

W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:304)

W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)

W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)

W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)

W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)


소스와 오류로그는 다음과 같다...

오류는 456번 라인 InputStream inputStream = httpURLConnection.getInputStream();    여기서 오류가 나는데...

정확한 원인을 판단하기위해


try catch 문으로 한번 필터링해봤다.


} catch (MalformedURLException e) {
// 1. 잘못된 url
System.out.println("잘못된 url");
e.printStackTrace();
} catch( SocketTimeoutException e){
// 2. 타임아웃
System.out.println("타임아웃");
e.printStackTrace();
} catch (IOException e) {
//3. 네트웍 문제
System.out.println("네트웍 문제");
e.printStackTrace();
} catch( Exception e){
// 4. 기타 문제
System.out.println("기타 문제");
e.printStackTrace();
}

catch문을 다음과같이 장착시킨 후 실행해보니 2. 타임아웃 오류라고 뜨더라


그래서 HttpURLConnection소스에 타임아웃 소스를 추가시켰다.

httpURLConnection.setConnectTimeout( 8000 );
httpURLConnection.setReadTimeout( 8000 );

보통 이러면 오류가 사라진다고 함.

그런데도, 오류가 사라지지 않는다. 미치고 팔짝 뛸 노릇

그럼 뭐가 문젤까??


php소스 연결했을 때의 응답코드를 확인해봤다.


// 200 성공코드
// 400 문법에러

if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
Log.d("상태", "성공");
Log.d("로그", Integer.toString(httpURLConnection.getResponseCode()));
// 성공시 처리
}else{
Log.d("상태", "실패");
Log.d("로그", Integer.toString(httpURLConnection.getResponseCode()));
}

httpURLConnection.getResponseCode()  의 반환값은 int형이며, 200일 경우 성공, 400일 경우 문법오류라고 한다.

그래서 돌려봤는데 값이 500이 나오더라...

이건 뭐지....

확인해보니 네트워크 오류라고 한다.

한마디로 php소스에 접근하는데 있어서 서버차원에서의 문제로 php사용이 안된다는건데... 그래서 아래와 같이 소스를 더 추가하여 에러내용을 상세히 알아봤다.

에러값을 인풋스트림 생성해서 로그로 출력되게 해봤다.

// 200 성공코드
// 400 문법에러

if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
Log.d("상태", "성공");
Log.d("로그", Integer.toString(httpURLConnection.getResponseCode()));
// 성공시 처리
}else{
Log.d("상태", "실패");
Log.d("로그", Integer.toString(httpURLConnection.getResponseCode()));
InputStream err = httpURLConnection.getErrorStream( ) ;
ByteArrayOutputStream bos = new ByteArrayOutputStream( ) ;
while( true )
{
int readlen = err.read( buf ) ;

if ( readlen < 1 )
break ;
bos.write( buf, 0, readlen ) ;
}
/// 에러메세지를 문자열로 저장
String output = new String( bos.toByteArray( ), "UTF-8" ) ;
/// 읽은 에러메세지를 출력한다.
System.err.println( output ) ;
// 실패시 처리
}

그런데 신기하게도, 원하는 출력값이 에러로 나오는 것이다.

왜 그럴까??

소스는 정상적으로 동작한다는 소린데, 왜 올바른 리턴값이 에러로 출력이 될까??


서버상에서서 php를 접근하는데 있어서 거절이 되는걸까?

permission을 건드려봤으나 이문제는 아니다.


근데 신기하게도 php소스에서 loop가 돌아가기 때문에 loop를 제거해보니 갑자기 에러가 안나는것이다.


그럼 무엇이 문젤까??


아마 서버상에서 안드로이드에서 보내오는 요청을 다 받아들이기 어려워서 에러로 출력하는 건 아닐까??

그렇게 생각하여 이리저리 찾아봤으나, 무료인 API를 사용하다보니 생기는 오류라고 이해하라더라....

결국 서버에 부하가 많이 없는 php소스를 사용하는게 정답이라고 하길래

소스를 더욱 개선했더니 잘 되더라.


하... php 소스 짤때에도 서버가 잘 견딜 수 있냐없냐를 생각해서 작업해야겠다.