Socket IO를 사용할 일이 있었는데, 웹소켓과 Socket IO에 대해 정리해보면 좋을 거 같아서 정리를 해봅니다
모두 실시간 양방향 통신을 위해 사용되지만, 내부 구조와 동작 방식에는 분명한 차이가 있어요
이번 포스팅에서는 WebSocket과 Socket.IO의 차이점, 그리고 각각을 Android에서 어떻게 연결해야하는지에 대해 알아보겠습니다
WebSocket | Socket IO | |
프로토콜 | 순수 WebSocket 프로토콜 (RFC 6455) | WebSocket 기반 + 추가 기능 (자체 프로토콜) |
통신 방식 | 단순한 양방향 통신 | 양방향 통신 + 이벤트 기반 통신 |
재연결 지원 | 기본적으로 없음 (직접 구현해야 함) | 자동 재연결 내장 (reconnect = boolean 으로 설정) |
Fallback 지원 | 없음 | WebSocket이 안 되면 HTTP long polling 사용 가능 |
브로드캐스트 | 직접 구현 필요 | 기본 지원 (io.emit, socket.broadcast.emit) |
WebSocket은 낮은 수준의 통신 채널이고, Socket.IO는 그 위에 올라가는 고수준 프레임워크
즉 Socket IO도 웹소켓을 기반으로 하지만 프로토콜이 다르기 때문에 연결 방식이 다름
그러므로 서버가 Socket.IO 기반이라면 클라이언트도 Socket.IO 클라이언트를 사용해야 정상적인 통신이 가능
WebSocket 연결
1. 라이브러리 추가
implementation("com.squareup.okhttp3:okhttp:4.12.0")
2. 연결
val client = OkHttpClient()
val request = Request.Builder()
.url(연결할 소켓 주소)
.build()
val listener = object : WebSocketListener() {
override fun onOpen(webSocket: WebSocket, response: Response) {
// 연결 성공 시
}
override fun onMessage(webSocket: WebSocket, text: String) {
// 서버로부터 메시지를 수신했을 때
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
// 에러 발생 시
}
}
val webSocket = client.newWebSocket(request, listener)
Request에서는 주소 외에도 헤더, 쿠키 등 옵션을 지정
client.newWebSocket()을 호출하면 즉시 비동기적으로 연결 시도가 시작
→ SocketIO와 달리 별도의 .connect()를 호출할 필요는 없습니다.
연결 결과는 WebSocketListener 콜백을 통해 확인
3. 서버로 메시지 전송 시
webSocket.send(미리 약속된 형식의 데이터)
//string
webSocket.send("Hello World!")
//json
val json = """
{
"type": "chat",
"message": "Hello"
}
""".trimIndent()
webSocket.send(json)
서버와 약속된 형식(JSON 등)에 맞춰 데이터를 전송해야함
전송 가능한 데이터 타입
- String
- JSON 형식 문자열
- Binary Data
Socket IO 연결
1. 라이브러리 연결
implementation("io.socket:socket.io-client:2.1.2")
2. 소켓 생성 및 연결
import io.socket.client.IO
import io.socket.client.Socket
import org.json.JSONObject
lateinit var mSocket: Socket
try {
mSocket = IO.socket(연결할 소켓 주소 )
} catch (e: URISyntaxException) {
e.printStackTrace()
}
mSocket.on(Socket.EVENT_CONNECT) {
//
}
mSocket.on("message") { args ->
// 서버에서 내려오는 메시지가 찍히는 부분
// args로 payload를 가져올 수 있습니다,,
}
mSocket.connect()
3. 서버로 메시지 전송 시
mSocket.emit(미리 약속된 이벤트명, 보낼 데이터)
Socket.IO는 이벤트 기반 통신이기 때문에, 약속된 이벤트 이름 + 데이터 형태로 메시지 전송
전송 가능한 데이터는 대부분의 기본 타입이 포함
안드로이드는 서버의 상황에 따라 가게 되지만..
Socket.IO는 자체 프로토콜을 사용하기 때문에 서버와 클라이언트는 반드시 같은 방식으로 구성되어야 하고,
WebSocket은 표준 프로토콜이라서 다양한 플랫폼에 독립적으로 연결할 수 있는 장점이 있지만, 그만큼 기능은 단순하고 직접 구현해야할 부분이 많다는 단점이 있다
'📱 Android' 카테고리의 다른 글
[Android] 하나의 화면에 다양한 UI 블록을 구성하는 3가지 방식 (2) | 2025.07.28 |
---|---|
[Android] NetworkInfo Deprecated (0) | 2025.06.06 |
[Android] MVI 패턴, 이름을 왜이렇게 헷갈리게 지었어요? (0) | 2025.05.27 |
[Android] WorkManager (0) | 2025.04.18 |
[Android] 클린 아키텍처 적용 시 고민했던 3가지 의문점 (0) | 2025.04.12 |