참고
멀티 스레드를 이용한 서버 & 클라이언트
NOTE
스레드는 main 스레드와 EchoServerThread 스레드로 나뉘게 된다.
•
이전에 진행했던 Socket 프로그래밍의 경우, 여러 개의 클라이언트를 처리하는데 있어서는 read 메소드의 Blocking으로 인해 어려움이 있었다. ⇒ 동시에 여러 클라이언트의 요구를 처리하지 못한다!
•
이문제를 해결하기 위해서 다중 스레딩을 구현한 서버를 사용!
•
다중 스레드 서버는 클라이언트가 접속 할때 마다 1개 이상의 스레드를 만들어 돌리기 때문에 블록킹 I/O 문제를 해결해준다.
•
요약
◦
main ⇒ 클라이언트의 연결을 받기만한다,
◦
EchoServerThread ⇒ 클라이언트와 데이터를 주고받게 한다.
멀티 스레드 동시성 제어
NOTE
3-1에서 기록했던 쓰레드 개념을 활용해서 ServerSocket 코드를 변경!
public class MultiThreadServer extends Thread {
private Socket socket = null;
public MultiThreadServer(Socket clientSocket) {
this.socket = clientSocket;
}
public void run() {
try {
System.out.println(socket + " : 연결됨");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 데이터를 받아둘 List
List<String> list = new ArrayList<>();
// 데이터를 한줄씩 읽어낸다.
String receivedData = reader.readLine();
while (receivedData != null) {
String[] dataItems = receivedData.split(" ");
list.addAll(Arrays.asList(dataItems));
receivedData = reader.readLine();
}
System.out.println();
System.out.println("전송된 데이터 개수 : " + list.size());
list.clear();
} catch (IOException ex) {
System.err.println(ex.getMessage());
} finally {
try {
if (socket != null) {
socket.close();
socket = null;
}
} catch (IOException ex) {
System.err.println(ex.getMessage());
}
}
}
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9000);
while (true) {
Socket clientSocket = serverSocket.accept();
MultiThreadServer server = new MultiThreadServer(clientSocket);
server.start();
}
} catch (Exception ex) {
System.err.println(ex.getMessage());
}
}
}
Java
복사
성공!