Java (12) 썸네일형 리스트형 8편 : TCP 소켓통신을 통한 멀티플레이 기능 구현 - 클라이언트 구현 Client 구현 클라이언트는 기존의 MainGUI 객체를 기본으로 하여 구현하였다. 소켓 통신을 위해 필요한 메서드들을 추가해주었다. startClient() : 채널그룹 객체와 소켓채널 객체를 생성한다. 서버채널에 연결을 요청하고 클라이언트를 시작한다. stopClient() : 작업 과정에 예외가 발생했거나 모든 작업을 마쳤을 경우, 클라이언트를 종료한다. 채널그룹과 소켓채널을 닫는다. receive() : 서버채널로부터 데이터를 받는다. send(String data) : data를 서버채널로 보낸다. handleResult(List args) : receive()에 대한 버튼 별 콜백함수로 읽은 데이터를 기반으로 GUI를 변경하거나 유저에게 알림을 보낸다. startClient() public .. [Java] NIO 기반 네트워킹 : TCP 넌블로킹(non-blocking) 채널 시작하며 IO기반의 네트워킹에서 TCP 통신을 위해 Socket과 ServerSocket 객체를 제공한다면 NIO기반의 네트워킹에서는 SocketChannel과 ServerSocketChannel을 제공한다. 사용방식은 Socket, ServerSocket과 거의 유사하다. IO기반의 TCP 통신에서는 연결을 요청하거나 수락하는 accept/connect 메서드, 읽고 쓰기 위한 read/write 메서드를 실행하면 블로킹이 일어나게 된다. 그렇기 때문에 이러한 메서드를 사용할 시 UI나 다른 작업의 블로킹을 막기위해 새로운 스레드를 생성하여 작업을 수행한다. 우리는 이러한 방식을 블로킹 방식이라고 한다. 반면 NIO기반의 TCP 통신의 경우 블로킹 방식외에도 메서드 실행시 블로킹이 일어나지 않는 넌블로.. [Java] NIO 기반 입출력 : 파일 비동기 채널 비동기 처리란? 파일채널에서 다뤘던 read/write 메서드나 IO기반 입출력에서 다뤘던 읽기/쓰기 메서드들을 메서드가 호출되면 해당 메서드가 실행을 마칠때까지 코드가 블로킹된다. 블로킹된 동안에는 UI와 상호작용 하는 코드나 이벤트 처리를 못하게 된다. 이를 방지하기 위해 멀티 스레드 환경을 구축하여 별도의 스레드에서 입출력 작업을 진행하기도 한다. 하지만 이러한 방식은 스레드를 폭증하게 만들고, 불특정 다수의 대용량 파일들을 입출력할때는 비효율적이다. 이를 해결하기위해 코드를 실행한 후, 그 코드가 종료되지 않더라도 바로 다음 코드를 실행하는 방식의 처리가 있는데 이를 비동기 처리라고 한다. 자바에서는 NIO기반의 파일 비동기 채널(AsynchronousFileChannel)을 통해 비동기 처리를 .. [Java] NIO 기반 입출력 : 파일 채널 FileChannel Java는 NIO기반의 입출력 시스템에서 파일 읽기/쓰기를 위한 FileChannel을 제공한다. FileChannel은 기본적으로 동기화 처리가 되어 있어 멀티 스레드 환경에서 사용해도 안전하다. FileChannel의 생성과 종료 FileChannel은 자신의 정적 메소드인 open()으로 FileChannel 객체를 생성할 수 있다. 또한 FileInputStream/FileOutputStream의 getChannel 메서드를 통해서도 얻을 수 있다. FileChannel fileChannel = FileChannel.open(Path path, OpenOption option1, OpenOption option2, ...) open() 메서드는 매게인자로 파일의 경로 객체와 .. [Java] 네트워크(Networking) : TCP 통신 들어가기 앞서... 본 포스팅은 TCP 통신을 '자바로 어떻게 구현'하는지에 대한 이야기입니다. TCP 통신 자체에 대한 내용은 이후 [컴퓨터공학] 카테고리에 작성할 예정입니다 :) TCP 서버의 역할 TCP 서버의 역할은 두가지이다. 첫째는 클라이언트의 연결 요청을 수락하는 것이고, 둘째는 클라이언트와 통신하는 것이다. 이때 연결 요청을 수락하는 역할을 하는 것이 ServerSocket 객체이고, 통신을 하는 역할이 Socket 객체이다. 이때 Client의 socket 객체는 connect() 메서드를 통해 연결을 요청하고 ServerSocket은 accept() 메서드를 통해 연결을 수락한다. 또한 연결 요청시에는 반드시 서버의 ip주소와 포트번호가 있어야 한다. ServerSocket server.. [Java] 멀티 스레드(Multi Thread) (7) : 스레드풀, 작업의 완료 1 지연 완료 객체 (Pending Completion Object) : submit() 6편에서 다뤘듯이 submit()에 의해 처리가 요청된 작업은 종료시 처리 결과를 Future 객체로 리턴한다. 이때 Future 객체는 get() 메서드를 통해 결과값을 리턴 받을 수 있는데 get()을 호출하면 스레드가 작업을 완료할때까지 블로킹 되었다가 작업이 완료되면 결과를 리턴한다. 그래서 Future을 지연 완료 객체라고 한다. get() 메서드를 호출할 경우, 모든 작업이 블로킹 되기 때문에 get() 메소드는 새로운 스레드거나, 스레드 풀의 다른 스레드에서 실행 되어야 한다. 리턴값이 없는 경우 submit() 메서드의 인자로 Runnable 객체를 줄 경우, 리턴값이 없게 된다. 이때 Future.get.. [Java] 멀티 스레드(Multi Thread) (6) : 스레드풀의 작업의 생성과 처리 작업 생성 각 작업은 Runnalbe 혹은 Callble 구현 클래스로 표현된다. Runnable과 Callable의 차이점은 리턴값의 유무이다. 다음은 Runnable과 Callable 구현 클래스의 작성 예시이다. Runnable task = new Runnable() { @Override public void run() { // ... } } Callable callable = new Callable() { @Override public T call() thorws Exception { // ... return T; } } callable 구현객체는 리턴타입이 있어야 하며 리턴타입을 제네릭으로 선언한다. 그리고 runnable과 callalbe 구현 클래스는 각각 run(), call() 메서드를 .. [Java] 멀티 스레드(Multi Thread) (5) : 스레드풀의 생성과 종료 컴퓨터의 작업량이 점점 많아지면... 병렬로 처리할 작업의 양이 많아지면 자연스럽게 스레드의 양도 많아지게 된다. 스레드의 양이 많아지면 더 많은 스레드의 생성과 이에 따른 스케줄링으로 인해 CPU의 메모리 사용량은 점점 많아지게 되고, 컴퓨터의 성능 저하로 이어지게 된다. 이를 방지하기 위해 한 시스템 내에서 처리될 수 있는 스레드의 양을 제한할 필요성이 있고, 이때 사용할 수 있는것이 스레드풀(Thread Pool)이다. 스레드풀 (Thread Pool) 아래 그림을 보면 스레드풀(Thread Pool)에 자리가 남을 경우, 작업 큐(Task Queue)에서 스레드를 가져온다. 그리고 새로이 처리 되고자 하는 스레드는 작업 큐에 푸쉬되게 된다. 스레드 풀에 있는 스레드의 개수는 제한된 숫자를 넘을 수.. 이전 1 2 다음