안드로이드 개발자의 창고
[52일차 Android] Socket 통신 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Socket
- 서버와 클라이언트 간에 연결된 Socket을 통해 통신하는 방법으로 프로그램 종료 시 까지 온라인으로 유지할 수 있는 특징을 가지고 있다.
- 안드로이드 Socket 네트워크 구현 방법은 일반 자바 프로그램에서 구현하는 방법과 동일하다.
- 데이터를 주고 받는 부분 뿐만 아니라 접속 관리 등 많은 기능을 구현해야 하기 때문에 서버 구현이 어려운 편이다.
예제 코드
Server.kt
fun main() {
// 사용할 포트 번호
val portNumber = 50000
// 서버 객체 생성
val serverSocket = ServerSocket(portNumber)
// 사용자 접속 대기
println("사용자 접속 대기")
val socket = serverSocket.accept()
println(socket)
// 스트림 추출
val inputStream = socket.getInputStream()
val dataInputStream = DataInputStream(inputStream)
val outputStream = socket.getOutputStream()
val dataOutputStream = DataOutputStream(outputStream)
// 클라이언트에게 데이터 전달
dataOutputStream.writeInt(100)
dataOutputStream.writeDouble(11.11)
dataOutputStream.writeBoolean(true)
dataOutputStream.writeUTF("서버가 보낸 문자열")
// 클라이언트에게 데이터 수신
val data1 = dataInputStream.readInt()
val data2 = dataInputStream.readDouble()
val data3 = dataInputStream.readBoolean()
val data4 = dataInputStream.readUTF()
println("data1 : $data1")
println("data2 : $data2")
println("data3 : $data3")
println("data4 : $data4")
socket.close()
serverSocket.close()
}
MainActivity.kt(Client)
- 안드로이드는 모든 네트워크 코드는 쓰래드로 운영해야 한다.
- 네트워크 특히 모바일은 통신에 문제가 발생할 가능성이 높기 때문에 오류 발생시 안드로이드 애플리케이션 자체가 종료되는 것을 예방하기 위함이다.
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
// server와 동일한 IP, Port 번호 지정
val SERVER_IP = "192.168.0.24"
val SERVER_PORT = 50000
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run {
button.setOnClickListener {
thread {
val socket = Socket(SERVER_IP, SERVER_PORT)
// 스트림 추출
val inputStream = socket.getInputStream()
val outputStream = socket.getOutputStream()
val dataInputStream = DataInputStream(inputStream)
val dataOutputStream = DataOutputStream(outputStream)
// 서버로부터 데이터 수신
val data1 = dataInputStream.readInt()
val data2 = dataInputStream.readDouble()
val data3 = dataInputStream.readBoolean()
val data4 = dataInputStream.readUTF()
// 서버에게 데이터 전달
dataOutputStream.writeInt(200)
dataOutputStream.writeDouble(22.22)
dataOutputStream.writeBoolean(false)
dataOutputStream.writeUTF("클라이언트가 보낸 문자열")
// 서버로부터 받은 데이터로 화면 구성
runOnUiThread {
// textView.text = socket.toString()
textView.text = "data1 : ${data1}\n"
textView.append("data2 : ${data2}\n")
textView.append("data3 : ${data3}\n")
textView.append("data4 : $data4")
}
socket.close()
}
}
}
}
}
'Computer > Android' 카테고리의 다른 글
[Android] MVC / MVP / MVVM 차이 (0) | 2023.09.02 |
---|---|
[Android] MVVM (0) | 2023.08.24 |
[52일차 Android] 앨범에서 사진 가져오기 (0) | 2023.07.24 |
[52일차 Android] 사진 촬영하기 (0) | 2023.07.24 |
[51일차 Android] Location (0) | 2023.07.20 |