Android 에서 Node.js의 Socket.io 사용해보기 (1편)

Joyce Hong
5 min readJul 28, 2019

--

나도 폰 두개 있고 싶다

안드로이드 구현을 직접 다룬, 2편이 업데이트 되었습니다. 영문입니다!

https://medium.com/@joycehong0524/simple-android-chatting-app-using-socket-io-all-source-code-provided-7b06bc7b5aff

1. 일단 Socket IO 란 무엇인가?

웹이 발전함에 따라 양방향성 통신이 중요해졌다. Socket IO 는 http는 한 번 요청을 하고 응답을 받으면 끝인것과 달리 이벤트 기반으로 데이터를 주고 받는 형식을 말한다. 즉 안드로이드 개발을 해보셨던 분들은 아시겠지만, 예를 들어 button에 리스너를 set 해놓으면 click 이라는 ‘event’ 가 발생할 시에 그 리스너에 구현해놓은 callback function 이 트리거 된다. 그리고 계속 이벤트가 발생할 때 까지 기다리고 있다.

Web에서 socket.io 를 구현하는 방법은 많이 나와있으므로 이 글에서는 어떻게 Socket IO 를 Android 에서 사용할 수 있을지 알아본다.

2. Socket IO 기초 지식 — Android 직접 코딩을 하기 전에 알아보고 간다.

일단 기본적으로 Node.js 에서 httpServer를 Socket IO 를 지원하는 서버를 업그레이드 한다. 이제 거기서 소켓을 열고 닫고 할 수 있다고 생각하면 된다.

아래는 그냥 간단히 맛보기 느낌으로 아 저런식으로 하는 구나 하고 예제에서 더 정확히 감을 잡을 수 있을 것이라 생각이 된다.

Node.js 스크립트 쪽

클라이언트 쪽으로 이벤트 발생시키기

  • socket.emit(“EVENT_NAME”, data) : 현재 연결되어 있는 소켓으로 이벤트 보내기
  • socket.broadcast.emit(“EVENT_NAME”, data) : 현재 Socket IO 서버에 연결되어있는 모든 socket에 보내기. 하지만 이거를 보내는 소켓은 제외.

클라이언트가 보내는 이벤트 듣기

  • socket.on(‘Event’,function(data) {console.log(‘data : ’+data)})

Android Studio 쪽

서버 쪽으로 이벤트 발생시키기

  • mSocket.emit(“EVENT_NAME”,data) : 데이터 담아서 이벤트 발생 시키기
  • mSocket.emit(“EVENT_NAME”) : 데이터 없이 이벤트 발생 시키기

서버 쪽에서 보낸 이벤트 듣기

  • mSocket.on(“EVENT_NAME”,mListener) : 콜백 함수를 포함한 리스너를 달아준다. 그럼 서버에서 이벤트를 보냈을 때 리스너 함수가 실행 된다. 더 자세히 리스너를 작성하는 방법은 아래서 알아보도록 한다.

3. Android 에서 메시지 주고 받기

안드로이드에 socket.io를 한 번 연결시켜 본다. Kotlin 을 사용할 예정이며 node.js 는 express를 사용할 예정입니다. 어떤식으로 node.js 서버와 android client 간에 데이터를 주고 받는지 중점적으로 보면 될 듯 싶습니다.

주석을 꽤나 열심히 달아보았습니다.

Node.js 서버 측 코딩

Android Studio 측 코딩

일단 기본적으로 준비를 해야 하는 것이 있다.

  • 코틀린 개발환경 : 이 예제를 더 쉽게 이해하기 위함인 것이지 꼭 필수적인 것은 아니라 자바로 하시려면 해도 된다.
  • dependency 추가 : 필수 아래처럼 해준다.

자 이제 socket IO client 쪽 코딩을 해보자.

보면 구현 방식은 꽤나 간단함을 알 수 있다. 이벤트 리스너를 등록하거나 이벤트를 Emit 하거나 둘 중 하나이다.

하면서 헷갈릴 수 있는 부분은 데이터 타입이 JavaScript에서 넘어올 때 어떤 형식으로 넘어오는 지이다. 정리해보면

  • [“a”,“b”,“c”] : 이런 식으로 넘기면 JSONArray타입으로 넘어온다. (이 타입만 주의해서 코딩하면 될 듯 싶다.)
  • “WHAT_EVER” : 스트링으로 넘기면 스트링으로 받는다.
  • {a : “hehe”, b: 23} : Object로 넘기면 JSONObject 타입으로 넘긴다.

데이터를 가지고 어떻게 할 지는 여러분의 몫으로 남겨두겠습니다. RecyclerView로 채팅방을 구현하는 것까지 글을 올리게 되면 주제에서 많이 벗어나므로…

4. 2편에서는 어떤 내용이..?

지금까지 본 통신으로는 1:1 혹은 1: 모든 소켓 통신밖에 서버에서 가능하지 않다. 다음 편에서는 네임스페이스와 룸을 통해 1:N 통신을 하는 방법을 알아본다

오류나 궁금하신 점 있으시면 아래에 댓글을 남겨주시면 감사하겠습니다

--

--

Joyce Hong

Blockchain, Android Developer | Share the knowledge 🌏 | Defi will rule the world one day