자바 FX(Java FX)를 이용한 서버 및 클라이언트 채팅 프로그램 개발할 것이다.
Main.java



Client.java


ExecutorService
쓰레드 풀(Thread Pool)을 이용하기 위해서 Executer Service 라이브러리를 사용한다.
여러 개의 쓰레드를 효율적으로 관리하기 위해 사용하는 대표적인 라이브러리이다.
기본적으로 쓰레드 숫자에 제한을 두기 때문에 쓰레드풀로 쓰레드를 처리하게 되면 갑작스럽게 클라이언트 숫자가 폭주해도 쓰레드의 숫자에는 제한이 있어서 성능 저하를 방지한다.
한정된 자원을 이용해 안정적으로 서버를 운영하기 위해 쓰래드 풀 기법을 사용한다.
쓰레드(Thread)
자바에서 쓰레드(Thread)를 사용하는 경우, 쓰레드 풀(Thread Pool)을 사용하면 효율적으로 쓰레드를 관리할 수 있다.
쓰레드 풀은 미리 생성된 쓰레드를 관리하며, 작업이 들어오면 해당 쓰레드를 할당하여 작업을 처리한다. 이를 통해 쓰레드 생성과 소멸에 따른 오버헤드를 줄일 수 있다
Socket
프로세스간 통신을 담당한다.
Socket 객체 안에 Inputstream과 OutputStream이 있어 이를 통해 통신(입출력)한다.
ServerSocket
포트와 연결(bind)하여 입력을 기다렸다가 입력이 들어오면 Socket을 생성해 데이터를 주고 받을 수 있게 해주는 객체이다.
하나의 포트에 하나의 ServerSocket만 연결할 수 있으나 프로토콜이 다르면 같은 포트를 공유할 수 있다.
Vector
ArrayList 대신 Vector를 사용한 이유는 멀티쓰레드 환경에서 벡터는 synchronized 처리가 돼있고 리스트는 안 돼있어서 Vector를 사용한다.
+) synchronized : 다른 쓰레드의 침범을 막기 위해 임계 영역을 설정한다.
InetSocketAddress
이 클래스는 네트워크 연결을 만들거나 관리할 때 IP 주소와 포트 번호를 나타내기 위해 사용된다.
주로 소켓 프로그래밍에서 자주 사용한다.
printStackTrace( )
예외 발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 출력한다.
Runnable
쓰레드를 이용해서 실행될 수 있는 클래스를 위해서 정의해 놓은 인터페이스이다.
Runnable 인터페이스는 단일 메소드 run( )만을 가지며, 이 메소드는 쓰레드가 실행될 때 호출된다. 따라서 run( ) 메소드에 원하는 작업을 구현하고, 쓰레드가 시작되면 해당 작업이 수행됩니다.
getRemoteSocketAddress()
Socket 클래스에서 제공되며, 소켓을 통해 연결된 원격 호스트의 IP 주소와 포트 번호를 확인하기 위해 사용된다.
Socket 클래스는 네트워크 통신을 위한 소켓을 나타내며, 클라이언트와 서버 간의 데이터 교환을 처리하는 데 사용된다.
Iterator
Iterator는 컬렉션을 순회하고 요소에 접근하는 데 사용되는 인터페이스이다.
Iterator를 사용하면 컬렉션의 각 요소에 대한 반복 작업을 수행할 수 있다.
일반적으로 Iterator는 hasNext() 메서드로 다음 요소의 존재 여부를 확인하고, next() 메서드로 다음 요소를 반환한다. 또한 remove() 메서드를 사용하여 컬렉션에서 현재 요소를 제거할 수도 있다.
InputStream/OutputStream
InputStream과 OutputStream은 Java에서 데이터를 읽고 쓰는 데 사용되는 추상 클래스이다.
이러한 클래스들은 입출력(I/O) 작업을 위한 기본적인 인터페이스를 제공하며, 다양한 입출력 소스와 대상에 대한 데이터 흐름을 다루기 위해 구체적인 서브클래스들을 사용한다.