NIO 프로필 및 3 대 구성 요소

4374 단어 데이터 구조
프로필
  • 데이터 전송 완료
  • BIO - BlockingIO - 동기 식 블록 식 IO
  • NIO - NonBlockingIO - 동기 식 비저 항 식 IO - JDK 1.4 에 나타 난
  • NIO 3 대 구성 요소: Buffer - 버퍼, 채널 - 채널, Selector - 선택 기
  • 2. NIO 와 BIO 의 비교
  • NIO 는 비 차단 적 이 고 BIO 는 차단 되 기 때문에 효율 적 으로 NIO 가 높 아야 합 니 다
  • BIO 가 읽 기와 쓰기 과정 을 한 번 완성 하려 면 대량의 흐름 대상 이 발생 해 야 한다. - 단 방향 이다.NIO 는 양 방향 전송 을 완료 하여 스 트림 생 성 수량
  • 을 줄 일 수 있 습 니 다.
  • 일대일 연결: 클 라 이언 트 의 모든 요청 은 서버 에서 하나의 스 레 드 와 대응 해 야 합 니 다.NIO 가 사용 하 는 한 쌍 이상 의 메커니즘: 한 개 또는 소량의 스 레 드 를 이용 하여 대량의 요청 을 처리 할 수 있 습 니 다
  • 연결 이 구축 되면 후속 작업 이 없 더 라 도 이 클 라 이언 트 는 서버 측의 스 레 드 를 점용 합 니 다.NIO 는 선택 체 제 를 구축 하고 클 라 이언 트 의 요청 에 따라 스 레 드 할당 여 부 를 확인 합 니 다
  • 3. buffer 버퍼 1, 안내
  • 데 이 터 를 저장 하 는 데 사용
  • 바 텀 은 배열 을 바탕 으로 저장
  • 기본 유형 만 저장
  • 8 가지 기본 유형 에 대해 대응 하 는 버퍼 류 를 제 공 했 지만 boolean 유형 은 없 었 다. ByteBuffer, Short Buffer, IntBuffer, LongBuffer, Float Buffer, DoubleBuffer, CharBuffer
  • 중요 한 위치: mark < = position < = limit < = capacity a. capacity: 용량 비트. 지정 한 버퍼 의 용량 / 크기 b. limit: 제한 비트. 작업 위치 가 도달 할 수 있 는 최대 아래 표 시 를 제한 하 는 데 사 용 됩 니 다. 버퍼 가 생 성 되 었 을 때 제한 위치 와 용량 위 치 는 같은 c. position: 작업 위치 입 니 다. 배열 의 아래 표 와 유사 합 니 다.읽 고 쓸 위 치 를 가리 키 는 데 사 용 됩 니 다. 버퍼 가 생 성 되 었 을 때 작업 위 치 는 0 위 d. mark: 태그 위치 입 니 다. 태그 위 치 는 기본적으로 사용 되 지 않 습 니 다
  • 중요 한 작업: a. flip: 버퍼 b. reset: 버퍼 c. rewind 리 셋: 버퍼 d. clear: 버퍼 비우 기
  • 채널
  • 데이터 전송 에 사용
  • 버퍼 를 대상 으로 조작
  • 양 방향 전송 가능
  • 파일 에 대한 채널: FileChannel 네트워크 에 대한 채널: UDP - DatagramChannel TCP - SocketChannel ServerSocketChannel
  • 채널 은 기본적으로 막 히 고 수 동 으로 비저 장
  • 으로 설정 되 어 있 습 니 다.
    2. 클 라 이언 트
    public class SocketChannelDemo {
    public static void main(String[] args) throws IOException {
    //         
    SocketChannel sc = SocketChannel.open();
     //         
    sc.configureBlocking(false);
    //     
    //          ,               
    sc.connect(new InetSocketAddress("localhost", 8070));
    //     ,           
    while (!sc.isConnected())
    //       ,              
    //            ,      
    sc.finishConnect();
    //    
    sc.write(ByteBuffer.wrap("hello server".getBytes()));
    //   
    sc.close();
    	 }
    }
    

    3. 서버 쪽
    public class ServerSocketChannelDemo {
    public static void main(String[] args) throws IOException {
    //          
    ServerSocketChannel ssc = ServerSocketChannel.open();
    //     
    ssc.bind(new InetSocketAddress(8070));
    //       
    ssc.configureBlocking(false);
    //     
    SocketChannel sc = ssc.accept();
    //         
    while (sc == null)
    sc = ssc.accept();
    //     
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    sc.read(buffer);
    //      
    buffer.flip();
    System.out.println(
    new String(buffer.array(), 0, buffer.limit()));
    //   
    ssc.close();
     	}
    }
    

    5 selector 다 중 선택 기 1, 안내
  • 유용 한 요청 에 대해 선택: accept, read, write
  • 통 로 를 선택 할 때 통 로 는 반드시 비 차단 적 이 어야 한다
  • .
    서버 쪽
    public class Server { 
    public static void main(String[] args) throws IOException { 
    //          
    ServerSocketChannel ssc = ServerSocketChannel.open();
    //     
    ssc.bind(new InetSocketAddress(8070));
    //       
    ssc.configureBlocking(false);
    //      
    Selector selc = Selector.open();
    //           
    ssc.register(selc, SelectionKey.OP_ACCEPT); 
    while (true) {
    //     
    selc.select(); 
    //        
    Set keys = selc.selectedKeys();
    Iterator it = keys.iterator();
    while (it.hasNext()) {
    //       
    SelectionKey key = it.next();
    //    accept
    if (key.isAcceptable()) {
    ServerSocketChannel sscx = (ServerSocketChannel) key.channel();
    SocketChannel sc = sscx.accept();
    System.out.println("    ~~~");
    //      
    sc.configureBlocking(false);
    //     read  
    sc.register(selc, SelectionKey.OP_WRITE | SelectionKey.OP_READ);
    }
    //    read
    if (key.isReadable()) {   
    //            
    SocketChannel sc = (SocketChannel) key.channel();
    //     
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    sc.read(buffer);
    buffer.flip();
    System.out.println(new String(buffer.array(), 0, buffer.limit()));   
    //             
    sc.register(selc, key.interestOps() ^ SelectionKey.OP_READ);  
    }
    //    write
    if (key.isWritable()) {     
    //     
    SocketChannel sc = (SocketChannel) key.channel();     
    sc.write(ByteBuffer.wrap("hi client~~~".getBytes()));  
    sc.register(selc, key.interestOps() ^ SelectionKey.OP_WRITE);
    }   
    it.remove();
    			}
    		}	     
    	} 
    }
    

    좋은 웹페이지 즐겨찾기