괴이한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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
괴이한nio 비저항 통신코드를 먼저 붙여볼게요. 나는 Aserver의 시스템을 주석해 버렸다.out.println("acceptable") 및 AClient의 System.out.println ("connnect") 은 Aserver에서 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.