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 중국어 웹사이트의 기타 관련 기사를 참조하세요!