/socket.io/라는 경로에서 WebSocket 및 폴백 통신(HTTP Long Polling 등)을 처리wss://helloWorld.com/socket.io 같은 URL을 사용/socket.io를 통해 클라이언트 요청을 처리하며, 이는 초기 Handshake 및 데이터 통신의 필수 경로로 설정되어 있음⇒ URL 경로에 /socket.io가 포함되어 있는 것은 Socket.IO 서버에서 제공하는 기본 엔드포인트 패턴
try {
val socket = IO.socket("wss://helloWorld.com")
socket.connect()
socket.on(Socket.EVENT_CONNECT) {
println("Connected!")
}
socket.on("custom_event") { args ->
println("Received event: ${args[0]}")
}
} catch (e: Exception) {
println("Error: ${e.message}")
}
GET <https://helloWorld.com/socket.io/?EIO=4&transport=polling>{
"sid": "abc123",
"upgrades": ["websocket"],
"pingInterval": 25000,
"pingTimeout": 60000
}
⇒ 즉, 서버가 Socket.IO 기반이라면, 반드시 Socket.IO 클라이언트를 사용하는 것이 올바른 방법!
| 기능 | WebSocket | Socket.IO |
|---|---|---|
| 연결 방식 | WebSocket 전용 | WebSocket + 폴백(HTTP 등) |
| 연결 끊김 처리 | 수동 구현 필요 | 자동 재연결 제공 |
| 이벤트 기반 통신 | 미지원 | 지원 (커스텀 이벤트 정의) |
| 멀티플렉싱 (룸/네임스페이스) | 미지원 | 지원 |
Kotlin
class WebSocketHandler(private val serverUrl: String) {
private lateinit var mSocket: Socket
fun connect(onMessage: (String) -> Unit) {
try {
// Socket.IO 옵션 설정
val options = IO.Options().apply {
reconnection = true
reconnectionAttempts = 5
reconnectionDelay = 2000
}
mSocket = IO.socket(serverUrl, options)
// 연결 성공 이벤트
mSocket.on(Socket.EVENT_CONNECT) {
Timber.d("Connected to $serverUrl")
mSocket.emit("===emitReceive", "OK")
}
// 연결 실패 이벤트
mSocket.on(Socket.EVENT_CONNECT_ERROR) { args ->
Timber.e("Connection Error: ${args.joinToString(", ")}")
}
// 연결 끊김 이벤트
mSocket.on(Socket.EVENT_DISCONNECT) {
Timber.w("Disconnected from $serverUrl")
}
// 서버에서 메시지 수신 처리
mSocket.on("connected") { args ->
onMessage(args.joinToString(", "))
}
mSocket.connect()
} catch (e: Exception) {
Timber.e("Exception during WebSocket connection: ${e.message}")
}
}
fun disconnect() {
if (::mSocket.isInitialized && mSocket.connected()) {
mSocket.disconnect()
Timber.d("Disconnected from $serverUrl")
}
}
}