사진관리 어플(1)

2020, Apr 03    

사진관리 어플(1) - 소켓 통신

“코틀린 이것만 보면돼” 라는 책에 있는 사진관리 어플을 만들어 보려고한다.

여기서 소켓통신을 사용하는데 소켓통신의 흐름은 다음 사진과 같다.

소켓통신

앱 개발 초기단계에 클라이언트와 서버가 서로 IP를 주고받는 부분이 있다. 이때 문제가 생겼었다. 서버측에서 리슨을 하고, 클라이언트는 연결요청을해서 서버소켓과 클라이언트 소켓이 연결은 되는데, 그 반대의 경우가 되지 않는 것이였다.

에러가 나는 부분 부터 —- 로 표시

ServerMain.kt

serverSocket = ServerSocket(9000)
println("서버가 시작되었습니다.")
serverLayout.mConnectInfo.text = "연결 대기중...."
socket = serverSocket.accept()
println("클라이언트와 연결 완료(서버가 리슨)")
dis = DataInputStream(socket.getInputStream())

var clientIp: String? = null
clientIp = dis.readUTF()

println("ClientIP $clientIp receive!")
socket.close()
dis.close()
serverSocket.close()
--------------------------------------
socket = Socket("$clientIp", 1256)  // 여기에서 타임 아웃에러가 발생..

처음 서버가 시작되고 accept를 해서 clientIp를 받아 오는거 까지는 잘 실행 되었다. 하지만 그 반대로 서버 쪽에서 cilentIp로 연결을 시도하니까 에러가 난다.

Client.kt

socketAddress = InetSocketAddress(hostname, 9000) // hostname은 로컬 serverIp로 10.0.2.2
Log.d(Tag, hostname + " : 서버 연결 시도...")
connectSock = Socket()
connectSock.connect(socketAddress, mTimeout)
//연결 완료
serverDos = DataOutputStream(connectSock.getOutputStream())
serverDos.writeUTF(mIpAddress) // clientIp전송

serverDos.flush()
connectSock.close()
--------------------------------------------
//리스너  소켓 생성 후 대기
serverSocket = ServerSocket(1256)
//연결되면 수신용 소켓 생성
receiveSocket = serverSocket.accept()

클라이언트쪽에서는 리슨을 계속 하는데 요청이 안들어온다고 판단해서 계속 리슨하는 상태이고, 서버는 충분한 시간동안 요청을 보내다 타임아웃이 되어서 에러가 발생한다.

어떤 이유에서 이런일이 발생했는지 4일동안 삽질을 했지만 결국 알아내지 못했다. 확실한것은 client는 AVD에서 돌아가기 때문에 AVD에서 로컬서버로 보내는것은 되지만, 로컬서버에서 AVD로 보내는것은 안된다는 것이다.

결국 나는 중간에 소켓을 닫는 부분(close())을 삭제하고 원래 9000번으로 연결되어있던 소켓을 유지시켜 나머지 작업도 처리하였다.

물론 이건 실시간 프로그램은 아니다보니 소켓을 계속 유지 시켜야할 이유가 없어서 close를 하는게 맞지만, 단순히 ip를 주고받는 부분은 close를 안해도 될거같다고 생각해서 이렇게 처리하였다.

지금은 이렇게 넘어가지만 이 부분은 개발을 해 나가면서 꼭 해결해보겠다.


참조: https://recipes4dev.tistory.com/153