java网络编程
BIO
1 | psvm{ |
graph RL
ss --bind --> s
subgraph server
s(s:127.0.0.1:8888)
end
subgraph listen
s --accept--> thread1
s --accept--> thread2
s --accept-->thread3
end
BIO会出现的问题
- ss.accept()内的线程会
- read
- write
解决方案:轮询
NIO-single Thread(NewNon-Blocking)
说明:大管家selector轮询:如果有客户端连接,就处理(单线程)压力很大

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20psvm{
ServerSocketChannel ssc = .open();
ssc.socket().bind (~~~);
ssc.configureBlocking(false);
Selector selector = Selector.open();
ssc.register(selector ,~);
while(true){
selector.select(); //轮询选择到的请求 -> 也是阻塞
Set<SelectionKey> key -> selector.selectedKeys(); //事件发生 把当前事件设个key
//遍历SelectinKey 把得到的key remove
handle(key)
}
}
void handle(){
ServerSocketChannel ssc = key.channel();
SocketChannel sc = ssc.accept();
//阻塞 -> false
sc.register( //设一个key)
}
graph RL
boy(大管家) --注册--> accept1
boy(大管家) --注册--> accept2
subgraph list
key_one
key_two
end
subgraph 插座
accept1 --register--- key_one
accept2 --register--- key_two
等待
end
AIO
实现了异步非阻塞IO
AIO取消了对Selector注册通道的轮询
采用hock函数将read 、write 、accept 3个不同模块分别交付给os操作。