어떤 유저가 로그인을 성공했을시에 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를 추가했습니다.