카테고리 없음

안드로이드 스튜디오에서 Websocket과 연결하기 (프론트)

sorecord 2025. 4. 2. 16:39

어떤 유저가 로그인을 성공했을시에 websocket과 연결이 될 수 있게 구현했다. 

 

mainactivity파일

composable("login") {
    LoginScreen(
            viewModel = authViewModel,
            onLoginSuccess = { #로그인을 성공했을 경우에 
                val userId = authViewModel.getUserId() // ViewModel에서 사용자 ID 가져오기
                val intent = Intent(this@MainActivity, ManageService::class.java).apply {
                    putExtra("USER_ID", userId.toString()) // 사용자 ID 전달
                }
                startService(intent) //TTSService의 onStartCommand()가 실행
......

//////authViewModel.py

fun setUserId(id: Int) {
        userId = id
    }

fun getUserId(): Int? {
    return userId
}

login함수 내부에 setUserId(it.id) 함수를 사용하여 유저의 id값을 받아온다.

 

사용자 ID를 AuthViewModel에서 가져와서 ManageService로 넘겨주는 것이다. 

 

ManageService.kt 파일

class ManageService : Service() {
    private var ttsRealTime: TTSRealTime? = null

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val userId = intent?.getStringExtra("USER_ID") //intent로 보낸 userid값을 가져온다.
        if (userId != null) {
            WebConnect = WebConnect(userId, this) //id값이 존재하면 WebConnect로 id값을 보낸다.
            WebConnect?.connect()
        } else {
            Log.e("ManageService", "USER_ID is null. Cannot start WebSocket connection.")
        }
        return START_STICKY // 서비스가 강제 종료되면 자동으로 재시작
    }

    override fun onDestroy() {
        super.onDestroy()
        WebConnect?.disconnect() // WebSocket 연결 종료
        WebConnect = null
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null // 바인딩 필요 없음
    }
}

 

현재 진행 상황은 유저가 로그인을 하면 유저의 아이디값을 받아와 WebConnect로 보내는 과정이다.

 

WebConnect.kt

 


class WebConnect (private val userId: String,private val context: Context) : WebSocketListener() {
    private val TAG = "Subscriber"
    private val client = OkHttpClient()
    private var webSocket: WebSocket? = null
    private var mediaPlayer: MediaPlayer? = null
    private var reconnectAttempts = 0

    fun connect() { //웹 소켓을 연결을 하는 코드. 
        val request = Request.Builder() //builder을 통해 객체를 초기화한다. 
            .url("ws://your-server-name/ws/audio/$userId/") //서버에서 WebSocket 연결을 처리하기 위한 경로
            .build() //요청 객체를 생성한다. 
        webSocket = client.newWebSocket(request, this)//HTTP 및 WebSocket 요청을 처리
    }
    
    override fun onMessage(webSocket: WebSocket, text: String) { //서버에서 값을 받아왔을때 실행이 되는 코드
        try {
            val data = JSONObject(text) //수신한 메시지(text)를 JSON 객체로 변환
            val audioData = Base64.decode(data.getString("audio"), Base64.DEFAULT)

			// 디코딩된 오디오 데이터를 임시 MP3 파일로 저장
            val tempFile = File.createTempFile("tts", ".mp3").apply {
                deleteOnExit()
                writeBytes(audioData)
            }

            playAudioFile(context, tempFile)
        } catch (e: Exception) {
            Log.e(TAG, "Error: ${e.message}")
        }
    }

 

이런 과정으로 websocket과 연결이 되었다 

 

글로 간단히 정리해보자면

1. 유저가 로그인을 한다.

2. acitivity파일에서 intent를 통해 ManageService를 실행한다. 

3. ManageService가 WebConnect를 실행하고 원하는 경로로 websocket과 연결된다. 

 

gradle파일에는 okHttp를 추가했습니다.