개발일기
[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 받기에 성공함!!