괴이한nio 비저항 통신

3914 단어 기업 응용
코드를 먼저 붙여볼게요.

public class AServer {
	public static void main(String[] args) throws Exception {
		ServerSocketChannel server = ServerSocketChannel.open();
		server.configureBlocking(false);
		server.socket().bind(new InetSocketAddress(8080));
		Selector selector = Selector.open();
		server.register(selector, SelectionKey.OP_ACCEPT);
		
		while (true) {
			selector.select();
			System.out.println("selector.select()---------" + selector.select());
			//readKeys  
			Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
			while (iter.hasNext()) {
				SelectionKey key = iter.next();
				iter.remove();
				
				if (key.isAcceptable()) {
					System.out.println("acceptable");
//					ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
					SocketChannel client = server.accept();
					client.configureBlocking(false);
					client.register(selector, SelectionKey.OP_READ);
				} else if (key.isReadable()) {
					System.out.println("this server is readable");
				}
			}
		}
	}
}

-------------------------------------------------------------------------------------------------------

public class AClient {
	public static void main(String[] args) throws Exception {
		SocketChannel client = SocketChannel.open();
		client.configureBlocking(false);
		Selector selector = Selector.open();
		client.register(selector, SelectionKey.OP_CONNECT);
		client.connect(new InetSocketAddress("localhost", 8080));
		
		while (true) {
			selector.select();
			//readKeys
			Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
			while (iter.hasNext()) {
				SelectionKey key = iter.next();
				iter.remove();
				
				if (key.isConnectable()) {
//					System.out.println("connnect");
					SocketChannel socket = (SocketChannel) key.channel();
					socket.configureBlocking(false);
//					socket.register(selector, SelectionKey.OP_READ);
//					System.out.println("client is connected");
				} else if (key.isReadable()) {
					System.out.println("client is read");
				}
			}
		}
	}
}

-------------------------------------------------------------------------------------------------------
나는 Aserver의 시스템을 주석해 버렸다.out.println("acceptable") 및 AClient의 System.out.println ("connnect") 은 Aserver에서 System을 인쇄할 수 없습니다.out.println (this server is readable) 이 있습니다.
그리고 두 가지 문제는 내가 System에 돈을 걸지 않았다는 것이다.out.println("acceptable") 및 System.out.println ("connnect") 에서는 Aserver에서 System을 실행합니다.out.println("this server is readable");AClient 역시 System을 계속 수행합니다.out.println (connnect), 내가 의심하는 것은 집행되었다
SelectionKey key = iter.next();
				iter.remove();
이거 다음에 키가 삭제됐잖아. 많이 나오지 말았어야 했는데.
if (key.isConnectable()) {
//					System.out.println("connnect");
					SocketChannel socket = (SocketChannel) key.channel();
					socket.configureBlocking(false);
//					socket.register(selector, SelectionKey.OP_READ);
//					System.out.println("client is connected");
				} 
이 안에 인쇄된 내용이군요
그리고 또 궁금한 게 Aserver에서.
SocketChannel client = server.accept();
					client.configureBlocking(false);
					client.register(selector, SelectionKey.OP_READ);
이 코드를 실행하고client 등록SelectionKey.OP_READ는 읽을 수 있는 동작입니다. 서버와 클라이언트의 키가 모두 Readable에서 읽을 수 있습니까?읽을 수 있는 경우 AClient에 인쇄되지 않은 이유
System.out.println("client is read");
이 말이야.
친숙하지 않기 때문에 여러분 저를 도와 볼 수 있습니까, 감사 ing

좋은 웹페이지 즐겨찾기