| 방법 | 장점 | 단점 |
|---|---|---|
| OkHttp | 사용 편의성, 안정성, Android 최적화 | OkHttp 라이브러리에 의존 |
| Java 표준 | 추가 라이브러리 필요 없음 | 구현 복잡성 증가, Android 프로젝트에서 최적화 부족 |
| Tyrus | WebSocket 표준 API 준수 | 설정이 복잡, 추가 라이브러리 필요 |
| Socket.IO | 실시간 이벤트 기반 통신에 강점 | 서버와 클라이언트 모두 Socket.IO 프로토콜을 사용해야 함 |
| Ktor | Kotlin 멀티플랫폼 지원, 경량화 | 추가 학습 필요, Android 전용은 아님 |
Connected, Closing, Closed, Failure)를 계속 추적해야 하므로, 상태 관리가 중요→ WebSocket의 특화된 통신 방식을 효율적으로 관리하기 위해 따로 구성하는 것이 좋다!
class WebSocketHandler(private val serverUrl: String) {
private val client = OkHttpClient()
private lateinit var webSocket: WebSocket
fun connect(onMessage: (String) -> Unit) {
val request = Request.Builder().url(serverUrl).build()
webSocket = client.newWebSocket(request, object : WebSocketListener() {
// 연결이 성공적으로 열렸을 때 호출
override fun onOpen(webSocket: WebSocket, response: Response) {
super.onOpen(webSocket, response)
}
// 텍스트 메시지 수신
override fun onMessage(webSocket: WebSocket, text: String) {
super.onMessage(webSocket, text)
onMessage(text)
}
// 바이너리 메시지를 수신
override fun onMessage(webSocket: WebSocket, bytes: ByteString) {
super.onMessage(webSocket, bytes)
}
// 서버가 연결을 닫으려 할 때 호출
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
super.onClosing(webSocket, code, reason)
// 클라이언트에서도 연결 정리
webSocket.close(1000, null)
}
// 연결이 완전히 종료되었을 때 호출
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
super.onClosed(webSocket, code, reason)
}
// 연결 실패나 에러가 발생했을 때 호출
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
super.onFailure(webSocket, t, response)
}
})
}
// 현재 연결된 웹소켓으로 메시지 전송
fun sendMessage(message: String) {
if (::webSocket.isInitialized) {
webSocket.send(message)
println("Sent message: $message")
} else {
println("WebSocket is not connected.")
}
}
// 웹소켓 연결을 닫습니다. 정상적인 종료 코드(1000)와 함께 연결을 정리
fun disconnect() {
if (::webSocket.isInitialized) {
webSocket.close(1000, "Client closed connection")
}
}
}
onClosing
close() 호출을 완료해야 onClosed가 호출onClosed
ps. wss://echo.websocket.events 로 연결 테스트 해볼 수 있다!