마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

HttpURLConnection 관련 질문입니다

0 추천
우선 처음 실행될때는 정상적으로 잘작동하는데 두번째 실행될때는

IOException 에러로 java.net.SocketTimeoutException: timeout 발생

그리고 그다음은 MalformedURLException 에서 Failed to connect to 주소명 오류가 발생합니다....

모든기기에서 그러는건아니고 몇개의 기기에서만 간혈적으로 발생중입니다.

웹개발자이다보니 주먹구구식으로 어플개발중인데...도움좀 부탁드립니다 ㅠ

public class RequestHttpURLConnection {

    public String request(String _url, ContentValues _params){
        HttpURLConnection urlConn = null;
        StringBuffer sbParams = new StringBuffer();

        if (_params == null)
            sbParams.append("");
        else {

            boolean isAnd = false;

            String key;
            String value;

            for(Map.Entry<String, Object> parameter : _params.valueSet()){
                key = parameter.getKey();
                value = parameter.getValue().toString();

                if (isAnd)
                    sbParams.append("&");

                sbParams.append(key).append("=").append(value);

                if (!isAnd)
                    if (_params.size() >= 2)
                        isAnd = true;
            }
        }
        try{
            URL url = new URL(_url);
            urlConn = (HttpURLConnection) url.openConnection();

// [2-1]. urlConn 설정.
            urlConn.setConnectTimeout(1000); //서버에 연결되는 Timeout 시간 설정
        urlConn.setReadTimeout(1000); // InputStream 읽어 오는 Timeout 시간 설정

        urlConn.setRequestMethod("POST"); // URL 요청에 대한 메소드 설정 : POST.
            urlConn.setRequestProperty("Accept-Charset", "euc-kr"); // Accept-Charset 설정.
            //urlConn.setRequestProperty("Context_Type", "application/x-www-form-urlencoded;charset=euc-kr");
            urlConn.setDoInput(true);                // 읽기모드 지정
            urlConn.setUseCaches(false);             // 캐싱데이터를 받을지 안받을지
            urlConn.setDoOutput(false); //POST 데이터를 OutputStream으로 넘겨 주겠다는 설정
            urlConn.setDefaultUseCaches(false);
            String strParams = sbParams.toString(); //sbParams에 정리한 파라미터들을 스트링으로 저장. 예)id=id1&pw=123;
            OutputStream os = urlConn.getOutputStream();
            os.write(strParams.getBytes("euc-kr")); // 출력 스트림에 출력.
            os.flush(); // 출력 스트림을 플러시(비운다)하고 버퍼링 된 모든 출력 바이트를 강제 실행.
            os.close(); // 출력 스트림을 닫고 모든 시스템 자원을 해제.

            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "euc-kr"));
            String line;
            String page = "";

            while ((line = reader.readLine()) != null){
                page += line;
            }
            return page;
        } catch (MalformedURLException e) { // for URL.
            Log.d("debeg", "10:"+String.valueOf(e));
            e.printStackTrace();
        } catch (IOException e) { // for openConnection().
            Log.d("debeg", "11:"+String.valueOf(e));
            e.printStackTrace();
        } finally {
            Log.d("debeg","12");
            if (urlConn != null) {
                urlConn.disconnect();
            }
        }
        return null;
    }

}
gilda (120 포인트) 님이 2021년 4월 7일 질문

1개의 답변

0 추천
urlConn.setConnectTimeout(1000); //서버에 연결되는 Timeout 시간 설정
urlConn.setReadTimeout(1000); // InputStream 읽어 오는 Timeout 시간 설정

위의 설정값은 Miliseconds 입니다. 즉 1000 ms = 1 second 1초입니다. 제 생각에는 타임아웃이 너무 짧은 것 같아요. 여유있게 한 10초 이상으로 정도롤 늘려보세요.

public static final CONNECTION_TIMEOUT_MS = 30  * 1000L;
public static final READ_TIMEOUT_MS = 30 * 1000L

그리고 HttpUrlConnection 을 쓰는 개발자는 거의 없습니다. 보통은 Retrofit이나 Retrofit + OkHttp를 사용합니다. JSON 파서인 Gson과 함께 많이 사용합니다.

spark (227,470 포인트) 님이 2021년 4월 7일 답변
...