인터넷 소켓 주소(InetSocketAddress)

Ada·2024년 1월 23일
0

자유 공부

목록 보기
19/19

스칼라에서는 자바와 동일하게 java.net 패키지의 ServerSocket과 Socket 클래스를 사용하여 TCP 서버와 클라이언트를 구현할 수 있습니다. 이를 바탕으로 다음과 같이 구현할 수 있습니다.


1. ServerSocket과 Socket의 용도 및 InetSocketAddress 사용

서버 측 구현:

1. ServerSocket 생성 및 바인딩:

서버는 InetSocketAddress를 사용하여 특정 IP 주소(또는 호스트명)와 포트 번호에 바인드합니다.
ServerSocket은 클라이언트의 연결 요청을 수락하고, 각 클라이언트와의 통신을 위한 Socket을 생성합니다.

import java.net.{InetSocketAddress, ServerSocket}

val serverSocket = new ServerSocket()
serverSocket.bind(new InetSocketAddress("localhost", 5001))

2. 클라이언트 연결 수락:

accept 메서드는 클라이언트의 연결 요청을 기다리며, 연결이 수립되면 해당 클라이언트를 위한 Socket 객체를 반환합니다.

try {
  while (true) {
    val socket = serverSocket.accept()
    val remoteSocketAddress = socket.getRemoteSocketAddress.asInstanceOf[InetSocketAddress]
    println(s"[연결 수락함] ${remoteSocketAddress.getHostName}")
    // 데이터 통신 처리 부분 (InputStream, OutputStream 사용)
  }
} finally {
  if (serverSocket != null && !serverSocket.isClosed) {
    serverSocket.close()
  }
}

클라이언트 측 구현:

Socket 생성 및 서버에 연결 요청:

클라이언트는 Socket 객체를 생성하여 서버의 IP 주소와 포트 번호에 연결 요청을 합니다.
InetSocketAddress를 사용하여 서버의 주소 정보를 설정할 수 있습니다.

import java.net.{InetSocketAddress, Socket}

val socket = new Socket()
socket.connect(new InetSocketAddress("localhost", 5001))
println("[연결 성공]")

2. Socket 데이터 통신

양쪽의 Socket 객체로부터 입력 스트림(InputStream)과 출력 스트림(OutputStream)을 얻어 데이터를 주고받을 수 있습니다.

데이터 송신:

val data = "보낼 데이터"
val byteArr = data.getBytes("UTF-8")
val outputStream = socket.getOutputStream
outputStream.write(byteArr)
outputStream.flush()

데이터 수신:

val byteArr = new Array[Byte](100)
val inputStream = socket.getInputStream
val readByteCount = inputStream.read(byteArr)
val receivedData = new String(byteArr, 0, readByteCount, "UTF-8")
profile
백엔드 프로그래머

0개의 댓글