nodejs + android Socket.IO 를 이용해 소켓 통신 만들기
NodeJs Socket Server
nodejs 의 socket.io 라이브러리를 사용하면 손쉽게 클라이언트와 소켓 통신을 할 수 있는 코드를 구현할 수 있다. 코드도 몇줄 되지 않는다. 아래 코드는 typescript로 소켓 통신 부분을 구현해본 것이다.
import express from 'express'
import httpLib from 'http';
import socketIO from 'socket.io';
const http = httpLib.createServer(express())
const socketio = new socketIO.Server(http, {})
socketio.on("connection", (socket: socketIO.Socket) => {
console.log('user connected socketId: ' + socket.id)
socket.on('msg', (message: any) => {
console.log('message received from client')
})
})
socketio.on("connection", ) 내부 콜백 함수는 서버와 클라이언트간의 소켓 통신이 연결 됐을 경우 불리는 함수다. 전달 인자로 받은 socket 객체에 통신하고 있는 클라이언트 정보가 있고 통신을 받기 위한 함수도 있다. 내부 socket.on('msg') 함수는 이벤트 명이 'msg' 인 경우 응답을 받는 콜백을 구현 할 수 있다. 메시지 형태는 any 타입이라 다양한 값을 주고 받을 수 있는게 장점이다.
연결된 모든 socket에 메시지를 보내려는 경우 socketio 객체의 emit 함수를 사용하면 된다. 마찬가지로 자유롭게 변수를 설정해서 메시지를 보낼 수 있다.
socketio.emit("msg", {})
Android Socket Client
Android 에서 socket.io 라이브러리를 사용하기 위해선 라이브러리를 임포트 해야한다. build.gradle에 아래 라이브러리를 추가한다.
implementation ('io.socket:socket.io-client:2.0.1') {
// excluding org.json which is provided by Android
exclude group: 'org.json', module: 'json'
}
소켓 객체는 socket io 라이브러리에 api를 추가하는 것으로 쉽게 구현 할 수 있다. connect(), disconnect() 로 연결 시키고 중단 할 수 있고 앞서 NodeJs 코드랑 비슷하게 socket.on 함수로 주고받은 이벤트의 callback을 등록할 수 있다. 아래 예제 코드는 주고 받는 이벤트 코드를 Gson으로 내부 코드로 매핑까지 해본 것이다.
class Socket @Inject constructor() {
private val socket: Socket = IO.socket(BuildConfig.API_HOST)
fun connect() {
socket.connect()
}
fun disconnect() {
socket.disconnect()
}
fun listen() {
socket.on("msg") { args ->
val obj = args[0] as JSONObject
when (obj["key"] as String) {
CelebVoteUpdateEvent.KEY -> {
val broadcast = Gson().fromJson((obj["value"] as JSONObject).toString(), CelebVoteUpdateEvent::class.java)
onCelebVoteUpdated.onNext(broadcast)
}
}
}
}