>  기사  >  Java  >  Nio의 구체적인 작업 프로세스에 대한 샘플 코드

Nio의 구체적인 작업 프로세스에 대한 샘플 코드

零下一度
零下一度원래의
2017-07-03 11:20:211645검색
 1 public void selector() throws IOException { 2     
 ByteBuffer buffer = ByteBuffer.allocate(1024); 3     
 Selector selector = Selector.open(); 4     
 ServerSocketChannel ssc = ServerSocketChannel.open(); 5     
 ssc.configureBlocking(false);//设置为非阻塞模式 6     
 ssc.socket().bind(new InetSocketAddress(8080)); 7     
 ssc.register(selector, SelectionKey.OP_ACCEPT);//注册监听事件 8     
 while(true) { 9         Set selectorKeys = selector.selectorKeys();
 //取得所有key的集合10         Iterator it = selectorKeys.iterator();11         
 while(it.hasNext()) { //检查序列是否还有元素12             
 SelectionKey key = (SelectionKey) it.next();13             
 if((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {14                 
 ServerSocketChannel ssChannel = (ServerSocketChannel) key.channel();15                 
 SocketChannel sc = ssChannel.accept();//接受到服务端的请求16                 
 sc.configureBlocking(false);17                 
 sc.register(selector,SelectionKey.OP_ACCEPT);18                 
 it.remove();19             } 
 else if((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {20                 
 SocketChannel sc = (SocketChannel) key.channel;21                 
 while(true) {22                     buffer.clear();23                     
 int n = sc.read(buffer);//读取数据24                     
 if(n <= 0) {25                         
 break;26                     }                     
 buffer.flip();28                 }                
 it.remove();30             }    
 }
 }
 }

  위 코드는 Nio의 구체적인 작업 프로세스에 대한 책에 나오는 코드 예제입니다. 작업 프로세스는 다음과 같이 자세히 설명할 수 있습니다.

NIO의 핵심 개념인 Channel 및 Selector라는 두 가지 주요 클래스가 있습니다. 채널은 교통수단에 비유할 수 있으며, 자동차, 자전거 등 구체적인 이동수단을 의미합니다. Selector는 차량 작동 상태 및 특정 배차 작업을 모니터링하는 차량 배차 시스템과 비교할 수 있습니다.

serverSocketChannel 클래스는 스트림 지향 수신 소켓을 위한 선택적 채널입니다. 서버는 이러한 인스턴스를 생성한 후 Socket() 메서드를 통해 ServerSocket을 반환합니다(이 채널과 연결된 서버 소켓 가져오기). 클래스, 이 인스턴스의 void 바인딩(SocketAddress 엔드포인트) 메서드를 사용하여 ServerSocket를 특정 주소(IP 주소 및 포트 번호)에 바인딩합니다. 택시 회사의 모든 택시가 회사에 등록되어야 하는 것처럼, Register() 메서드를 통해 지정된 선택기에 ServerSocketChannel 인스턴스도 등록해야 합니다.

그런 다음 Selector의 selectedKeys 메서드를 호출하여 이 선택기에 등록된 모든 통신 채널에 필요한 이벤트가 있는지 확인합니다. 특정 이벤트가 발생하면 key.readyOps()로 인해 모든 SelectionKeys가 반환됩니다. 준비 작업 세트를 가져옵니다. 따라서 개인적으로 key.readyOps()&SelectionKey.OP_ACCEPT는 이 키의 Ready 작업 집합이 ACCEPT 상태, 즉 서버가 Listening 상태에 있고 이 통신이 가능하다는 의미라고 생각합니다. 이 객체의 Channel 메소드를 통해 얻은 다음 accept() 메소드를 호출하여 기본적으로 차단된 소켓 채널을 반환합니다. 또한 Channel 메소드로 얻은 통신 채널 객체를 사용하여 통신 데이터를 읽을 수도 있습니다. 여기서 읽은 데이터는 버퍼입니다. 이 버퍼는 제어 가능한 버퍼입니다.


위 내용은 Nio의 구체적인 작업 프로세스에 대한 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.