19장. NIO 기반 입출력 및 네트워킹.

Slides:



Advertisements
Similar presentations
컴퓨터와 인터넷.
Advertisements

Chapter 16 : Struts 프레임워크 2. chapter 16 : Struts 프레임워크 2.
네트워크 프로그래밍 및 실습.
CHAP 22. 블루투스.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
Power Java 제3장 이클립스 사용하기.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
5강. Servlet 본격적으로 살펴보기-I 프로젝트 만들기 doGet() doPost()
Network Lab. Young-Chul Hwang
Java로 배우는 디자인패턴 입문 Chapter 5. Singleton 단 하나의 인스턴스
연결리스트(linked list).
데이터 파일 C 데이터 파일과 스트림(Stream) 텍스트 파일 처리
8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용 8.3 인터페이스의 상속 8.4 인터페이스 참조
18장. IO기반 입출력 및 네트워킹.
5장. 참조 타입.
Linux서버를 이용한 채팅프로그램 지도 교수님 : 이형원 교수님 이 름 : 이 은 영 학 번 :
CHAPTER 02 OpenCV 개요 PART 01 영상 처리 개요 및 OpenCV 소개.
8장. 원격지 시스템 관리하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
자바 5.0 프로그래밍.
Chapter 06. UDP 서버/클라이언트.
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
NJM Messenger 박상원 박연호.
                              데이터베이스 프로그래밍 (소프트웨어 개발 트랙)                               퍼스널 오라클 9i 인스톨.
Chapter 03 : 서블릿 ( Servlet ) 개요. chapter 03 : 서블릿 ( Servlet ) 개요.
TCP/IP Socket Programming…
10장. 예외처리.
자바 5.0 프로그래밍.
11장. 1차원 배열.
속성과 리스너 초기화 파라미터 외 파라미터에 대해 이해한다. 리스너를 생성해보고 사용에 대해 이해한다.
CHAP 12. 리소스와 보안.
I/O&socket통신 POWERPOINT & GROUP STUDY 한재희 김상훈 최기람 황인준 이어진.
Method & library.
자바 5.0 프로그래밍.
인터넷응용프로그래밍 JavaScript(Intro).
Java의 정석 제 5 장 배 열 Java 정석 남궁성 강의 의
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
Lesson 2. 기본 데이터형.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
15장 컬렉션 프레임워크 Section 1 컬렉션 프레임워크의 개요 Section 2 리스트 Section 3 셋
USN(Ubiquitous Sensor Network)
8장 쿠키와 세션 한빛미디어(주).
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
자바로 만든 채팅 프로그램 임경진 조주경 지도교수님 : 이광세 교수님.
CHAP 21. 전화, SMS, 주소록.
네트워크 환경 구축과 이미지 전송 호스트/타겟 통신 직렬 통신을 이용한 이미지 전송 수퍼 데몬 BOOTP 환경 구축
STS 에서 웹 서버 설치 방법.
클래스 : 기능 CHAPTER 7 Section 1 생성자(Constructor)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
JSP Programming with a Workbook
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
함수, 모듈.
MIDP 네트워크 프로그래밍 ps lab 김윤경.
발표자 : 이지연 Programming Systems Lab.
9 브라우저 객체 모델.
다자간 채팅프로그램 김형도 허영민
Android -Data Base 윤수진 GyeongSang Univ. IT 1.
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
JSP Programming with a Workbook
06. 디바이스의 등록과 해제 김진홍
Completion Port기반의 채팅프로그램
CHAP 15. 데이터 스토리지.
 6장. SQL 쿼리.
Docker Study 6~7.
버스와 메모리 전송 버스 시스템 레지스터와 레지스터들 사이의 정보 전송을 위한 경로
7 생성자 함수.
6 객체.
20 XMLHttpRequest.
Presentation transcript:

19장. NIO 기반 입출력 및 네트워킹

1절. NIO 소개 2절. 파일과 디렉토리 3절. 버퍼(Buffer) 4절. 파일 채널(FileChannel) 5절. TCP 동기(블로킹) 채널 6절. TCP 넌블로킹 채널 7절. UDP 채널 8절. 비동기 파일 채널 9절. TCP 비동기 채널

1절. NIO 소개 NIO(New Input/Output) 기존 java.io API와 다른 새로운 입출력 API 자바4부터 추가  자바7부터 네트워크 지원 강화된 NIO.2 API 추가 관련 패키지

1절. NIO 소개 IO와 NIO의 차이점 스트림 vs. 채널 IO 스트림: 입력 스트림과 출력 스트림으로 구분되어 별도 생성

1절. NIO 소개 IO와 NIO의 차이점 넌버퍼 vs. 버퍼 IO 스트림 - 넌버퍼(non-buffer) 보조 스트림인 BufferedInputStream, BufferedOutputStream를 사용해 버퍼 제공 가능 스트림으로부터 입력된 전체 데이터를 별도로 저장해야 저장 후 입력 데이터의 위치 이동해가면서 자유롭게 이용 가능 NIO 채널 - 버퍼(buffer) 기본적으로 버퍼 사용해 입출력 - 성능 좋음 읽은 데이터를 무조건 버퍼(Butter: 메모리 저장소)에 저장 버퍼 내에서 데이터 위치 이동해 가며 필요한 부분만 읽고 쓸 수 있음

1절. NIO 소개 IO와 NIO의 차이점 블로킹 vs 넌블로킹 IO 스트림 - 블로킹 입력 스트림의 read() 메소드 호출 데이터 입력 전까지 스레드는 블로킹(대기상태) 출력 스트림의 write() 메소드 호출 데이터 출력 전까지 스레드는 블로킹 스레드 블로킹 -다른 일을 할 수가 없고 interrupt 해 블로킹 빠져나올 수도 없음 블로킹을 빠져 나오는 유일한 방법 - 스트림을 닫는 것 NIO 채널 – 블로킹, 넌블로킹 NIO 블로킹은 스레드를 interrupt 함으로써 빠져나올 수 있음 NIO는 넌블로킹 지원 입출력 작업 시 스레드가 블로킹되지 않음 준비 완료된 채널을 선택하는 기능!!!

1절. NIO 소개 네트워크 프로그램 개발 시 IO와 NIO의 선택 IO 방식 선택하는 경우 NIO 방식 선택하는 경우 연결 클라이언트의 수가 적고, 전송되는 데이터가 대용량이면서 순차적으로 처리될 필요성 있을 경우 NIO 방식 선택하는 경우 연결 클라이언트의 수가 많고 전송되는 데이터 용량이 적으면서, 입출력 작업 처리가 빨리 끝나는 경우

2절. 파일과 디렉토리 파일 관련 패키지 경로 정의(Path) IO는 파일의 속성 정보 읽기 위해 File 클래스만 제공 NIO는 좀 더 다양한 파일의 속성 정보 제공 클래스와 인터페이스를 java.nio.file, java.nio.file.attribute 패키지에 서 제공 경로 정의(Path) java.nio.file.Path 인터페이스 IO의 java.io.File 클래스에 대응 NIO의 여러 곳에서 파일 경로 지정 위해 Path 사용 Path 구현 객체 java.nio.file.Paths 클래스의 정적 메소드인 get() 메소드로 얻음 얻고 싶은 정보에 따른 메소드는 p.1103~1105 참조

2절. 파일과 디렉토리 파일 시스템 정보(FileSystem) 운영체제의 파일 시스템은 FileSystem인터페이스 통해 접근 FileSystem 구현 객체는 FileSystems의 정적 메소드인 getDefault()로 얻을 수 있음 FileSystem에서 제공하는 메소드 파일 시스템 정보 출력 예제 p. 1106

2절. 파일과 디렉토리 파일 및 디렉토리 생성/삭제 및 속성 읽기(Files) 와치 서비스(WatchService) java.nio.file.Files 클래스 파일과 디렉토리의 생성 및 삭제, 이들의 속성을 읽는 메소드 제공 속성: 숨김, 디렉토리 여부, 크기, 소유자… 제공 메소드 참조해 파일 속성 읽고 출력 (p.1107~1109) 와치 서비스(WatchService) 디렉토리의 내용 변화 감시 (p.1110~1114) 자바 7에서 처음 소개 디렉토리내의 파일의 생성, 삭제, 수정 감시 적용 사례 에디터 바깥에서 파일 내용 수정하면 파일 내용이 변경됐으니 파일을 다시 불러올 것인지 묻는 대화상자 띄움

3절. 버퍼 버퍼(Buffer) 버퍼는 읽고 쓰기 가능한 메모리 배열 NIO에서는 데이터를 입출력을 하기 위해서는 항상 버퍼 사용

3절. 버퍼 Buffer 종류 분류 기준 저장되는 데이터 타입에 따라 분류 ByteBuffer, CharBuffer, IntBuffer, DoubleBuffer NIO 버퍼는 저장되는 데이터 타입에 따라 별도의 클래스로 제공 이들 버퍼 클래스들은 Buffer 추상 클래스 모두 상속 MappedByteBuffer는 파일의 내용에 랜덤하게 접근하기 위해서 파일의 내용을 메모리와 맵핑시킨 버퍼

3절. 버퍼 Buffer 종류 분류 기준 어떤 메모리를 사용하느냐에 따른 분류 다이렉트(Direct)와, 넌다이렉트(NonDirect) 버퍼 P.1115~1118 예제에서 버퍼 속도 차이만 확실히 이해

3절. 버퍼 Buffer 생성 allocate() 메소드(넌다이렉트 버퍼 생성) wrap() 메소드(넌다이렉트 버퍼 생성) 각 데이터 타입 별 넌다이렉트 버퍼 생성 매개값 - 해당 데이터 타입의 저장 개수 Ex) wrap() 메소드(넌다이렉트 버퍼 생성) 이미 생성되어 있는 타입 별 배열을 래핑해 버퍼 생성 일부 데이터만 가지고도 버퍼 생성 가능!

3절. 버퍼 allocateDirect() 메소드(다이렉트 버퍼 생성) JVM 힙 메모리 바깥쪽 (운영체제가 관리하는 메모리)에 다이렉트 버퍼 생성 각 타입 별 Buffer 클래스에는 없고 ByteBuffer 에서만 제공 asXXXBuffer() 메소드(각 타입 별 다이렉트 버퍼 생성) asCharBuffer(), asShortBuffer(), asIntBuffer(), asLongBuffer(), asFloatBuffer(), asDoubleBuffer() 우선 다이렉트 ByteBuffer를 생성하고 호출 초기 다이렉트 ByteBuffer 생성 크기에 따라 저장 용량 결정

3절. 버퍼 byte 해석 순서(ByteOrder) 운영체제는 두 바이트 이상을 처리할 때 처리 효율이나 CPU 디자인 상의 문제로 바이트 해석 순서를 정함 데이터를 외부로 보내거나 외부에서 받을 때도 영향 미치기 때문에 바이트 데이터를 다루는 버퍼도 이를 고려해야 ! Big endian: 앞 바이트부터 먼저 처리 Little endian: 뒤 바이트부터 먼저 처리

3절. 버퍼 byte 해석 순서(ByteOrder) 운영 체제가 사용하는 바이트 해석 순서 확인 방법 JVM은 동일한 조건으로 클래스 실행해야 하므로 무조건 Big endian Little endian으로 동작하는 운영체제에서 만든 데이터 파일을 Big endian로 동작하는 운영체제에서 읽어 들여야 한다면 ByteOrder 클래스 로 데이터 순서를 맞춰야 운영체제와 JVM의 바이트 해석 순서가 다를 경우 JVM이 운영체제와 데이터 교환 할 때 자동 처리 다이렉트 버퍼를 이용할 경우 운영체제의 native I/O를 사용 운영체제의 기본 해석 순서로 JVM의 해석 순서를 맞추는 것이 성능에 도움

3절. 버퍼 Buffer의 위치 속성(position, limit, capacity, mark) 사용 전 위치 속성의 개념, 속성이 언제 변경되는지 알고 있어야 position, limit, capacity, mark 속성의 크기 관계

3절. 버퍼 위치 속성을 이해를 위한 쓰기 모드 예 (p.1123~1126) 먼저 배열에 데이터 저장 읽기 모드로 변경하기 위해 flip() 메소드 호출 현재 position의 위치를 기억시키기 위해 mark() 호출 position을 mark 위치로 이동하기 위해 reset() 호출 버퍼를 되감아 처음부터 읽기 위해 rewind() 호출 버퍼의 위치 속성을 초기화하기 위해 clear() 호출

3절. 버퍼 Buffer 메소드 공통 메소드: Buffer 추상 클래스에 정의된 메소드

3절. 버퍼 데이터를 읽고 저장하는 메소드 데이터 읽기: get(…) 데이터 저장: put(…) Buffer 추상 클래스에는 없고, 각 타입 별 하위 Buffer 클래스가 가짐 상대적(Relative) 메소드 현재 위치 속성인 position에서 데이터를 읽고 저장 상대적 get()과 put() 메소드 호출하면 position 값 증가 position 값이 limit 값까지 증가한 상태 상대적 get() 사용 - BufferUnderflowException 예외 발생 상대적 put() 사용 - BufferOverflowException 예외 발생

3절. 버퍼 데이터를 읽고 저장하는 메소드 절대적(Absolute) 메소드 상대적과 절대적 메소드 구분 방법 position과 상관없이 주어진 인덱스에서 데이터 읽고 저장 절대적 get()과 put() 메소드를 호출하면 position의 값은 증가되지 않음 상대적과 절대적 메소드 구분 방법 상대적 메소드: index 매개값이 없는 메소드 절대적 메소드: index 매개값이 있는 메소드 상세 메소드는 1127~1128 페이지 참조

3절. 버퍼 버퍼 예외의 종류 버퍼 예외 발생 주요 원인 버퍼와 관련된 예외 클래스 버퍼가 다 찼을 때, 데이터를 저장하려는 경우 버퍼에서 더 이상 읽어올 데이터가 없을 때 데이터를 읽으려는 경우 버퍼와 관련된 예외 클래스 데이터 위치 속성 값의 변화 예제 통해 예외 발생 상황 이해 P.1129~1132

3절. 버퍼 Buffer 변환 채널이 데이터를 저장하고 읽는 버퍼는 모두 ByteBuffer P. 1132~1136 Ex 1): ByteBuffer에 특정 문자셋으로 인코딩 된 바이트들이 저장 디코딩 된 CharBuffer로 변환 후 문자열을 얻어야 Ex 2): ByteBuffer에 정수 바이트들이 저장되어 있을 경우 IntBuffer로 변환해서 읽어야 Ex 3): CharBuffer와 IntBuffer의 내용을 채널로 출력할 경우 ByteBuffer로 변환해야

4절. 파일 채널 파일 채널(FileChannel) 파일 읽기와 쓰기 가능하게 해주는 역할 동기화 처리가 되어 있기 때문에 멀티 스레드 환경에서 사용해도 안전

4절. 파일 채널 FileChannel 생성과 닫기 FileInputStream, FileOutputStream의 getChannel() 메소드 호출 FileChannel.open() 첫 번째 path 매개값 - 열거나, 생성하고자 하는 파일 경로 두 번째 options 매개값 - 열기 옵션 값 StandardOpenOption 의 다음 열거 상수 채널 닫기: FileChannel을 더 이상 이용하지 않을 경우

4절. 파일 채널 파일 쓰기와 읽기 파일 쓰기 파일 읽기 파일에 쓰여지는 바이트는 ByteBuffer의 position 부터 limit 까지 파일 읽기 파일에서 읽혀지는 바이트는 ByteBuffer의 position부터 저장 버퍼에 한 바이트를 저장할 때마다 position이 1씩 증가 버퍼에 저장한 마지막 바이트의 위치는 position-1 인덱스까지 한 번 읽을 수 있는 최대 바이트 수는 position부터 ByteBuffer의 capacity까지 리턴값은 파일에서 ByteBuffer로 읽혀진 바이트 수 0~(position-1)까지의 바이트 수 더 이상 읽을 바이트가 없다면 read() 메소드는 -1 리턴

4절. 파일 채널 파일 복사 두 개의 FileChannel 이용 Files.copy() 메소드 이용 첫 번째 source 매개값에는 원본 파일의 Path 객체 지정 두 번째 target 매개값에는 타겟 파일의 Path 객체 지정 세 번째 매개값은 StandardCopyOptoin 열거 상수를 목적에 맞게 나열

5절. 파일 비동기 채널 FileChannel의 단점 AsynchronousFileChannel read()와 write() 메소드는 작업하는 동안 블로킹 블로킹 동안에 UI 갱신이나 이벤트 처리를 할 수 없음 따라서 별도의 작업 스레드를 생성해서 이들 메소드를 호출해야 동시에 처리해야 할 파일 수가 많다면 스레드 수 증가로 문제 유발 가능 AsynchronousFileChannel read()와 write() 메소드는 즉시 리턴 이들 메소드는 스레드풀에게 작업 처리를 요청하고 즉시 리턴 작업 스레드가 파일 입출력 완료 - 콜백(callback) 메소드 자동 호출 불특정 다수의 파일 및 대용량 파일의 입출력 작업 시 유리

5절. 파일 비동기 채널 AsynchronousFileChannel의 동작

5절. 파일 비동기 채널 AsynchronousFileChannel 생성과 닫기 파일 읽기와 쓰기 (p.1144~1150) 생성 – 정적 메소드 open() 사용 닫기 – 채널을 더 이상 쓰지 않을 때 파일 읽기와 쓰기 (p.1144~1150) 매개변수 dst, src: 읽거나 쓰기 위한 ByteBuffer position: 파일에서 읽을 위치이거나 쓸 위치 attachment: 콜백 메소드로 전달할 첨부 객체 handler: CompletionHandler<Integer, A> 구현 객체 CompletionHandler<Integer, A> Integer: 입출력 작업 처리 후 결과 타입 (결과값은 읽거나 쓴 바이트 수) (고정) A: 첨부 객체 타입으로 첨부 객체가 필요 없다면 Void 지정(개발자 지정)

6절. TCP 블로킹 채널 TCP 서버/클라이언트 세가지 구현 방식 블로킹 넌블로킹 비동기 연결요청, 연결수락, 입출력 작업 시 블로킹 넌블로킹 연결요청, 연결수락, 입출력 작업 시 넌블로킹 작업 처리 준비된 것만 셀렉터가 선택해서 처리하는 방식 비동기 스레드풀에서 처리 후 콜백 메소드 호출

6절. TCP 블로킹 채널 서버소켓 채널과 소켓채널의 용도 ServerSocketChannel SocketChannel

6절. TCP 블로킹 채널 서버소켓 채널 생성과 연결 수락 ServerSocketChannel 생성 연결 수락 닫기 IP 와 포트 정보를 리턴해 주는 메소드 연결 수락 닫기

6절. TCP 블로킹 채널 소켓 채널 생성과 연결 요청 (p.1152~1154) SocketChannel 생성과 연결 요청 클라이언트가 서버에 연결 요청할 때 쓰이는 소켓 닫기 클라이언트가 종료되거나, 필요에 따라 연결 끊을 때 Close() 서버가 열려있어야 클라이언트 통신 가능

6절. TCP 블로킹 채널 소켓 채널 데이터 통신 read()가 블로킹이 해제 + 리턴 되는 경우

6절. TCP 블로킹 채널 스레드 병렬 처리

6절. TCP 블로킹 채널 채팅 서버 및 클라이언트 구현 (p.1160~1178) 블로킹과 인터럽트 채팅 서버의 경우 스레드 풀, 서버 소켓채널, 소켓채널의 동작 확인 채팅 클라이언트의 경우 소켓채널의 동작을 유심히 확인 블로킹과 인터럽트 IO 소켓에서는 입출력 스트림에서 작업스레드가 블로킹 된 경우 다른 스레드가 작업 스레드의 인터럽트 메소드 호출해도 블로킹이 풀리지 않음 NIO 소켓 채널의 경우 인터럽트 만으로도 소켓채널이 닫히면서 블로킹 풀림

7절. TCP 넌블로킹 채널 넌블로킹(non-blocking) 방식의 특징 셀렉터가 작업 처리 준비된 채널 선택 connect(), accept(), read(), write() 메소드는 블로킹 없이 즉시 리턴 작업 처리 준비가 된 상태에서 메소드 실행할 것 작업 처리 준비가 된 채널만 선택해 처리 셀렉터가 작업 처리 준비된 채널 선택 넌블로킹 채널은 이벤트 리스너 역할 하는 셀렉터(Selector) 사용 채널이 작업 처리 필요할 경우 셀렉터에 통보 셀렉터는 통보한 채널 선택 멀티 채널 작업을 싱글 스레드에서 처리 가능 작업 스레드가 블로킹되지 않음 셀렉터가 선택한 채널들을 싱글 스레드에서 모두 처리 가능 스레드 풀 사용할 경우, 적은 수의 스레드로 많은 양의 작업 처리

7절. TCP 넌블로킹 채널 셀렉터(Selector)의 동작 원리 채널은 자신의 작업 유형을 키(SelectionKey)로 생성 셀렉터의 관심 키셋(interest-set)에 키 등록 셀렉터는 작업 처리 준비가 된 키를 선택 선택된 키셋에 별도로 저장 작업 스레드는 선택된 키셋에서 키를 하나씩 꺼냄 연관된 채널 작업 처리

7절. TCP 넌블로킹 채널 셀렉터 생성과 등록 셀렉터 생성 – Open() 메소드 호출해 생성 Exception 발생 가능하므로 예외처리 필요 넌블로킹 채널 생성 – 하위 클래스도 넌블로킹이어야. 셀렉터 등록 첫 번째 매개값은 Selector 두 번째 매개값은 작업 유형별 SelectionKey의 상수

7절. TCP 넌블로킹 채널 선택된 키셋 Selector의 select() 메소드 select() 메소드 종류 관심 키셋의 SelectionKey로부터 작업 처리 준비가 되었다는 통보 올 때 까지 블로킹 최소한 하나의 SelectionKey로부터 작업 처리 준비가 되었다는 통보가 오면 리턴 리턴값은 통보를 해온 SelectionKey의 수 select() 메소드 종류 주로 첫 번째 메소드를 많이 사용

7절. TCP 넌블로킹 채널 선택된 키셋 select()가 리턴 되는 경우 SelectionKey 의 작업 유형 변경 최소한 하나의 채널이 작업 처리 준비가 되었다는 통보를 할 때 Selector의 wakeup() 메소드를 호출할 때 select()를 호출한 스레드가 인터럽트될 때 SelectionKey 의 작업 유형 변경 Selector의 wakeup() 메소드 호출 블로킹되어 있는 select() 즉시 리턴 변경된 작업 유형을 감시하도록 select() 재실행 선택된 키셋 얻기 select() 메소드가 1 이상의 값을 리턴 할 경우 selectedKeys() 메소드로 작업 처리 준비된 SelectionKey들을 Set 컬렉션으로 얻음

7절. TCP 넌블로킹 채널 작업 스레드에서 채널 작업 처리 선택된 키셋에서 SelectionKey를 하나씩 꺼내어 작업 유형별 채널 작업 처리 SelectionKey가 어떤 작업 유형인지 알아내는 방법 다음 메소드 중 어느 것이 true를 리턴하는가 SelectionKey로 부터 채널 객체 얻기 첨부 객체 저장과 얻기 SelectionKey에 첨부해두고, 사용 attach() 메소드는 객체 첨부 attachment() 메소드는 첨부된 객체를 얻을 때 사용

7절. TCP 넌블로킹 채널 채팅 서버 및 클라이언트 구현 (p.1186~1195) 셀렉터와 넌블로킹 서버채널, 넌블로킹 채널의 작동 이해 클라이언트의 경우 고유한 데이터 저장의 필요성 있음 연결 수락 시 마다 Client 인스턴스 생성해 관리 넌블로킹 방식의 소켓 채널로 개발 가능하나 서버 구현에 넌블로킹이 주로 쓰임 실행 방법은 TCP 블로킹 방식과 동일

8절. TCP 비동기 채널 TCP 비동기 채널의 특징 connect(), accept(), read(), write()를 호출하면 즉시 리턴 실질적 입출력 작업 처리는 스레드 풀의 스레드가 담당 스레드가 작업 처리 완료하면 콜백 메소드 호출

8절. TCP 비동기 채널 read() 메소드 호출 예 애플리케이션에서 read() 메소드를 호출하면 즉시 리턴 작업 스레드가 read() 메소드를 모두 실행하고 나면 completed() 콜백 completed() 메소드 실행하는 스레드는 스레드풀의 작업 스레드

8절. TCP 비동기 채널 비동기 채널 그룹 생성 및 종료 비동기 채널 그룹(AsynchronousChannelGroup) 같은 스레드풀 공유하는 비동기 채널들의 묶음 하나의 스레드풀을 사용한다면 모든 비동기 채널은 같은 채널 그룹

8절. TCP 비동기 채널 비동기 채널 그룹 생성 비동기 채널 그룹 종료 비동기 채널 생성할 때 채널 그룹 지정하지 않으면 기본 비동기 채널 그룹 기본 비동기 채널 그룹은 내부적으로 생성되는 스레드풀 이용 비동기 채널 그룹 종료 shutdown() 비동기 채널 그룹을 종료하겠다는 의사만 전달 즉시 비동기 채널 그룹을 종료하지 않음 비동기 채널 그룹에 포함된 모든 비동기 채널이 닫히면 종료 새로운 비동기 채널을 포함시키려고 하면 ShutdownChannelGroupException이 발생 shutdownNow() 강제적으로 비동기 채널 그룹에 포함된 모든 비동기 채널 닫고 비동기 채널 그룹을 종료 완료 콜백 실행하고 있는 스레드는 종료되거나 인터럽트 X

8절. TCP 비동기 채널 비동기 서버소켓 채널 생성 및 연결 수락 (p.1199~1201) 기본 비동기 채널 그룹에 포함되는 비동기 서버 채널 생성 새로 생성한 비동기 채널 그룹에 포함되는 비동기 서버 채널 생성 포트 바인딩 더 이상 소켓 채널이 사용되지 않으면 닫기 연결 수락 첫 번째 매개값은 콜백 메소드의 매개값으로 제공할 첨부 객체 두 번째 매개값은 콜백 메소드를 가지고 있는 CompletionHandler<AsynchronousSocketChannel, A> 구현 객체 비동기 소켓 채널 (p.1202~1204) 클라이언트와 서버 연결 후의 통신

8절. TCP 비동기 채널 채팅 서버, 클라이언트와 UI 구현 P.1204~1218 비동기 서버소켓채널과 비동기 소켓채널 사용법 이해 서버에는 다수의 클라이언트가 붙는다는 것을 전제로 작업 UI의 경우는 TCP 동기채널의 작동과 동일

9절. UDP 채널(DatagramChannel) NIO에서의 UDP 채널 DatagramChannel 동기(블로킹)과 넌블로킹 방식 모두 사용 가능 발신자 만들기 DatagramChannel 생성 - Open() 사용 Open() 할 때 ProtocolFamily 타입 매개값 StandardProtocolFamily 열거 상수 IPv4, IPv6 구분하기 위함 데이터 보내기 – send() 사용 닫기 – close() 사용

9절. UDP 채널(DatagramChannel) 수신자 만들기 DatagramChannel 생성 및 포트 바인딩 – open(), bind() 데이터 받기 데이터 받기 전까지 receive() 메소드 블로킹, 데이터 받으면 리턴 작업 스레드를 생성해 receive() 메소드 반복적 호출 작업 스레드 종료 방법 작업 스레드의 interrupt() 호출시켜 ClosedByInterruptException 예외 발생 DatagramChannel의 close() 호출시켜 AsynchronousCloseException 예외 발생 예외가 발생되면 예외 처리 코드에서 작업 스레드 종료 닫기