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操作。