Search
Duplicate
📒

[Java Study] 14-x. 멀티쓰레드 소켓 프로그래밍

상태
수정중
수업
Java Study
주제
4 more properties
참고

멀티 스레드를 이용한 서버 & 클라이언트

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
복사
성공!