[Android] Cocket으로 간단하게 socket.io 통신하기

shw0471·2022년 3월 24일
6
post-thumbnail

Cocket은 무엇일까?

cocket은 안드로이드에서 coroutine을 사용하여 retrofit과 유사한 방식으로
socket.io 통신을 할 수 있도록 만들어진 라이브러리 입니다.

제가 만들었어요 ㅎㅎ

Cocket 시작하기

Cocket으로 간단한 채팅 앱을 구현해보자!

구현할 앱의 기능은 다음과 같습니다.

  • 전체 채팅 전송
  • 채팅방 입장
  • 방 채팅 전송

방에 들어가지 않아도 모든 사람이 볼 수 있는 전체 채팅 기능과
채팅방에 입장하고 그 방에 채팅을 전송하는 기능을 갖고 있습니다.

1. gradle에 의존성 추가

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}
dependencies {
	implementation 'com.github.shw0471:cocket:$version'
}

우선 gradle에 다음과 같이 의존성을 추가해줍니다.

2. 서비스 인터페이스 정의하기

interface ChatService {

    @Connect
    suspend fun connectChatService()

    @Disconnect
    suspend fun disconnectChatService()

    @Emit("send.broadcast")
    suspend fun sendBroadCastMessage(broadcastMessage: BroadcastMessage)

	@Emit("join")
    suspend fun joinChatRoom(roomInfo: RoomInfo)

    @Emit("send.room")
    suspend fun sendRoomMessage(roomMessage: RoomMessage)

    @On("message")
    fun receiveBroadcast(): Flow<BroadcastMessage>

    @On("roomMessage")
    fun receiveRoomMessage(): Flow<RoomMessage>
    
    @Off()
    fun off()
}

위와 같이 서버와 통신할 내용을 서비스 인터페이스로 정의해줍니다.

@Emit과 @On, @Once 어노테이션 안에는
보내거나 받을 이벤트 명을 적어주면 됩니다.

이벤트를 받을 때는 suspend 키워드를 붙이지 말고
반환형은 coroutine의 Flow<>로 하셔야합니다.

data class BroadcastMessage(
    @SerializedName("content") val content: String
)

data class RoomInfo(
    @SerializedName("roomId") val roomId: String
)

data class RoomMessage(
    @SerializedName("content") val content: String,
    @SerializedName("roomId") val roomId: String
)

데이터 클래스들은 다음과 같습니다.

Cocket은 내부적으로 Gson을 이용해서 데이터 클래스를 Json으로 변환합니다

3. Cocket 클라이언트 생성

val cocket = CocketClient.Builder()
	.baseUrl("http://example.com")
    .build()
    
val chatService = cocket.create(ChatService::class.java)

위와 같이 Cocket 클라이언트와 ChatService의 인스턴스를 생성하고

// 소켓 연결
chatService.connectChatService()

// 소켓 연결 해제
chatService.disconnectChatService()

//채팅 방 접속
chatService.joinChatRoom(RoomInfo("abcd"))

// 전체 & 방 메시지 전송
chatService.sendBroadCastMessage(BroadcastMessage("Hello"))
chatService.sendRoomMessage(RoomMessage("Hi", "abcd"))

// 전체 & 방 메시지 받기
charService.receiveBroadcast().collect {
	// 들어오는 메시지 처리
}
chatService.receiveRoomMessage().collect {
	// 들어오는 메시지 처리
}
	
// 등록된 Listener 해제
chatService.off()

이렇게 ChatService의 메서드들을 호출해서
간단하게 Socket.io 통신을 할 수 있습니다.

4. UI 연결하고 작동 확인하기

위처럼 잘 작동하는 것을 확인할 수 있습니다.
전체 코드는 아래 링크에서 example 디렉토리에서 찾아보실 수 있습니다.

https://github.com/shw0471/Cocket

스타도 한번씩 눌러주세요
서버 만들어준 내 친구 홍정현 고마워!

마무리

궁금하거나 부족한 부분은 댓글 또는 Issue, PR 날려주세요.
긴 글 읽어주셔서 감사합니다!

profile
Android Developer

1개의 댓글

comment-user-thumbnail
2022년 3월 25일

💯

답글 달기