Archives
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[52일차 Android] Socket 통신 본문

Computer/Android

[52일차 Android] Socket 통신

Wise-99 2023. 7. 27. 18:21

 

 

 

출처 : 안드로이드 앱스쿨 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