본문 바로가기
Develop/Android

Android Socket 실시간 통신 라이브러리 활용

by 라이프레이서 2020. 6. 14.

목차

    반응형

    Android Socket 통신?

    소켓 통신 방식은 Server와 Client가 특정 Port를 통해 실시간으로 양방향 통신을 하는 방식입니다.

     

    Http통신 방식과 달리 Server도 Client로 요청을 보낼 수 있어요!

    실시간 통신이 필요한 경우에 자주 사용됩니다.

    우리사 사용하는 서비스들로는 실시간 스트리밍, 채팅 등이 있겠네요.

    카카오톡 채팅을 한 번 예로 들어볼게요.

    홍길동이 저에게 메시지를 주고싶을 때를 생각해보겠습니다.

     

    1. 홍길동이 메시지를 전송합니다.

    2. 서버에 해당 메시지 데이터가 전달이 됩니다.

    3. 서버에서 제 클라이언트 기기로 데이터를 전달해줍니다.(클라이언트는 카카오톡이 깔려 있는 기기를 뜻합니다!)

    4. 받은 데이터를 적절히 가공하여 저에게 보여줍니다.

    그럼 제가 메시지를 보낼때도 똑같은 흐름으로 데이터 전달이 일어나겠죠?

    1. 홍길동에게 메시지 전송합니다.

    2. 서버에서 해당 메시지를 받아와 홍길동의 기기로 전달해줍니다.

    3. 제 핸드폰에 보낸 메시지를 띄우고, 전송이 성공되었다면 1이, 실패했다면 다시 보내기/취소 등의 화면을 띄워줍니다.

    4. 상대방이 메시지를 읽으면 1을 사라지게 합니다.

     

    이 과정에서 일어나는 것이 바로 Socket 통신입니다!

    Socket 통신, 어떻게 구현하나요?

    socket.io/blog/native-socket-io-and-android/

     

    Socket.IO — Native Socket.IO and Android

    In this tutorial well learn how to create a chat client that communicates with a Socket.IO Node.JS chat server, with our native Android Client! If you want to jump straight to the code, its on GitHub

    socket.io

    Socket.io 라이브러리를 활용해서 구현을 하시면 되는데요! 공식 문서를 확인해주시면 됩니다.

    주요 함수들이 뭐가 있는지 알아보겠습니다.

     

    먼저, mSocket이라는 이름의 객체를 만들고, 설명을 이어가겠습니다.

    val mScoekt = IO.Socket("서버주소")

    소켓 객체를 만들었다면 이제 정말 간단한 함수들을 통해 소켓 통신을 할 수 있습니다.

    가장 기본적으로 서버와 연결 / 연결 끊는 코드를 볼게요

    mSocket.connect()
    mScoekt.disconnect()

    언제 호출할 지에 대해서는 액티비티/ 서비스의 생명주기를 잘 고려하여 호출해주셔야 합니다.

    연결은 했으니 이제 통신 주고받는 부분에 대해 구현하면 되겠죠?

    이 때 쓰이는 함수들을 보겠습니다.

    mSocket.on("new Message",onNewMessage)

    먼저 on 이라는 함수입니다. 서버로부터 "new Message"라는 Key값의 통신이 온다면 onNewMessage라는 리스너를 실행한다 라는 의미입니다.

    이 때 onNewMessage는 Emitter의 Listener에 등록하여 사용이 가능합니다.

     

    private val onNewMessage = Emitter.Listener {
    	var r = Runnable {
    		//뷰를 그려줄 로직
    	}
    	val thread = Thread(r)
    	thread.start()
    }
    

     이 뷰의 경우 홍길동의 메시지를 받았을 때 해당 데이터를 뷰에 그려줄 로직을 적어주면 될 것입니다.

     

     

     

     

     

     

     

    이렇게 on을 했으면 off하는 함수도 존재하겠죠?

    mSocket.off("new Message")

    말 그대로 켜 둔 스위치를 끈다라고 이해하시면 됩니다.

     

    mSocket.emit("pay",2625,..)

    다음은 emit 함수입니다.

    여기서 쓰인 emit 함수는 "pay"라는 key값을 붙여 데이터들을 서버로 전달해줍니다.

    왼쪽 그림의 경우 홍길동에게 2,625원을 받으라고 송금을 해주는 부분이라 전달하는 데이터로 2625를 적어주었습니다.

    이외의 데이터들 또한 ,(콤마) 를 통해 여러 개 전달 해줄 수 있습니다.

     

     

     

     

     

     

     

     

     

     

     

     

    기본적인 부분들은 이정도로 알아보았습니다.

    다음은 Socket.io를 다루며 경험해본 이슈들에 대해 말씀드리고자 합니다.

     

     

     

     

     

     

     

     

     

     

    Socket.io 라이브러리를 이용한 통신 시 마주했던 이슈

    1.  Activity/Service 생명주기

    위에서 말씀드렸듯이, 생명주기의 언제 호출하는지에 따라 통신 성공 여부가 갈립니다.

    공식 문서 및 오픈소스를 참고하면서 언제 소켓을 켜고 끌지, 연결하고 끊을지를 잘 생각하셔서 개발을 진행해야 합니다.

     

     

    2. 10초 이상 Socket통신이 이뤄지지 않을 때 disconnect

    (저는 서버에서 아무 의미 없는 ping을 지속적으로 보내 주며 연결을 지속했으나 옳은 방법인지는 아직 의문입니다.)

    * github 오픈소스를 참고하셔서 개발하시면 도움이 될 것 같습니다.

    아래 링크에 있는 오픈 소스를 보시면 socket.on이 먼저 선언된 이후 connect를 호출해주는 모습을 볼 수 있고,

    socket.disconnect 이후 socket.off가 호출 되는 것을 고려하면서 개발하시면 될 것 같네요!

    안드로이드 Socket.io 깃허브

     

    nkzawa/socket.io-android-chat

    A simple chat demo for socket.io and Android. Contribute to nkzawa/socket.io-android-chat development by creating an account on GitHub.

    github.com

     

    아직 불완전하지만 피드백 주신다면 수정하도록 하겠습니다.

    잘못 된 내용은 언제든 댓글 부탁드립니다.

    반응형