Stand up lee

[kotlin] error : 서버통신시 fail to connect to / java.net.SocketTimeoutException 본문

개발일기

[kotlin] error : 서버통신시 fail to connect to / java.net.SocketTimeoutException

tubeeee 2022. 2. 3. 20:14

kotlin으로 앱 내 회원가입을 위한 sms 인증을 개발하고자 했다. 
이를 위한 http 통신 테스트가 필요하여 GET, POST 요청을 진행하려고 했다.

필요한 코드는 다 작성했지만,

계속 이런 에러 메시지가 떴다.

두가지 에러 종류가 있었다.

1. 요청한 url이 https 가 아닌 http 이기 때문에 보안 문제로 제대로 작동하지 않음.

2. 요청을 시작한 후, retrofit의 제한 시간 내에 서버에 연결되지 않으면 해당 요청을 실패한 것으로 계산함.


해결방안

1. manifest 수정

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="***">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!--    Location    -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true">
        
        ***

위과 같이 manifest 안에 application 안에 android:usesCleartextTraffic="true" 를 추가한다.
(http를 허가해주는 설정이라고 한다)
여기에 더해서 에뮬레이터나 핸드폰 연결해서 디버깅 하는 경우에 앱을 삭제한 후, 다시 설치한다 (이거때문에 삽질했음..;;)

 

2. 서버와의 연결 제한 시간의 default 값이 10초로 설정되어 있다. okHttpClient 객체 시간을 늘린다.

        val okHttpClient = OkHttpClient.Builder()
            .connectTimeout(150, TimeUnit.SECONDS)
            .readTimeout(100, TimeUnit.SECONDS)
            .writeTimeout(100, TimeUnit.SECONDS)
            .build()

다음과 같이 connectTimeout 시간을 늘려준다.

• connectTimeout : 요청을 시작한 후 서버와의 연결이 완료되기까지의 시간
• readTimeout : 연결이 설정되면 서버로부터 모든 바이트가 전송되는 속도
• writeTimeout : 서버에 바이트를 전송하는 속도

Retrofit.Builder()
        .baseUrl(BASE_URL)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
        .create(API::class.java)

이것을 retrofit builder에 적용할 수 있음.

 


sms 받기에 성공함!!