스칼라에서는 자바와 동일하게 java.net 패키지의 ServerSocket과 Socket 클래스를 사용하여 TCP 서버와 클라이언트를 구현할 수 있습니다. 이를 바탕으로 다음과 같이 구현할 수 있습니다.
서버 측 구현:
서버는 InetSocketAddress를 사용하여 특정 IP 주소(또는 호스트명)와 포트 번호에 바인드합니다.
ServerSocket은 클라이언트의 연결 요청을 수락하고, 각 클라이언트와의 통신을 위한 Socket을 생성합니다.
import java.net.{InetSocketAddress, ServerSocket}
val serverSocket = new ServerSocket()
serverSocket.bind(new InetSocketAddress("localhost", 5001))
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 객체를 생성하여 서버의 IP 주소와 포트 번호에 연결 요청을 합니다.
InetSocketAddress를 사용하여 서버의 주소 정보를 설정할 수 있습니다.
import java.net.{InetSocketAddress, Socket}
val socket = new Socket()
socket.connect(new InetSocketAddress("localhost", 5001))
println("[연결 성공]")
양쪽의 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")