목록NIO (5)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Non-Blocking 블로킹 방식은 accept()에서 블로킹 되고, read() 메소드도 데이터를 읽을 준비를 위해 블로킹 됩니다. 그래서 연결된 SocketChannel당 하나의 스레드가 할당되어야 합니다. 그래서 연결된 클라이언트 수가 많으면 스레드 풀(ExecutorService)를 사용했었습니다. 그런데 non-blocking 방식에서는 connect(), accept(), read(), write() 메소드에서 블로킹을 하지 않습니다. non-blocking방식에서는 요청이 없거나 데이터를 보내지 않으면 null이나 0을 즉시 리턴하며 버퍼에는 아무 데이터도 저장되지 않습니다. 그래서 Selector를 사용해서 이벤트 리스너 역할을 합니다. Non-blocking 채팅 서버 import ja..
TCP 블로킹 채널 NIO에서는 non-blocking과 blocking 동기와 비동기 모두 제공하고 있습니다. ServerSocketChannel은 클라이언트의 SockeChannel의 연결 요청을 수락하고 SocketChannel을 생성 한 후에 서버와 클라이언트간 통신을 수행합니다. 소켓 채널 연결 및 데이터 전송 서버측 예제 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; p..
java.nio.channels.FileChannel 파일 채널을 통해 파일 읽기 쓰기를 할수 있습니다. 동기화 처리가 되어 있어서 멀티 스레드 환경에 안전하게 사용할 수 있습니다. 파일 생성 및 쓰기 import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class FileChannelWriteEx { ..
direct buffer / non-direct buffer direct buffer는 운영체제가 관리하는 메모리 공간을 사용하는 버퍼이고, non-direct buffer는 JVM이 관리하는 힙 메모리 공간을 이용하는 버퍼입니다. direct buffer가 버퍼의 생성은 느리지만 버퍼의 크기가 더 크고 성능이 더 높습니다. 생성시 allocateDirect() 메소드로 생성하면 direct버퍼로 생성되고 allocate()메소드로 생성하면 non-direct로 생성됩니다. Buffer import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.IntBuffer; public class BufferCapacityEx { public s..
NIO java.nio: 다양한 버퍼 클래스들 java.nio.channels: 파일채널, TCP채널, UDP채널 등 java.nio.charset: 문자셋, 인코더, 디코더 java.nio.file: 파일 IO/NIO 차이점 IO는 입출력을 스트림 방식(단방향 입출력)이지만 NIO는 채널 방식(양방향 입출력)입니다. IO는 버퍼가 없으나 NIO는 버퍼를 제공합니다. IO는 비동기방식을 지원하지 않지만 NIO는 비동기 방식을 지원합니다. IO는 블로킹방식이지만 NIO는 블로킹과 논블로킹 모두 지원합니다. NIO는 불특정 다수의 클라이언트 연결을 비동기로 처리할 수 있어서 과도한 스레드 생성을 피할 수 있습니다. 그래서 NIO는 클라이언트 수가 많고 하나의 입출력이 오래 걸리지 않는 작업에 적합합니다. 반..